xamarin 无法建立SSL连接

f0ofjuux  于 2023-05-15  发布在  其他
关注(0)|答案(9)|浏览(205)

我在ASP.NET核心应用程序中使用了第三方库(Splunk c# SDK)。我试图通过这个SDK连接到我的localhost Splunk服务,但我收到一个异常:
System.Net.Http.HttpRequestException:无法建立SSL连接,请参阅内部异常。
内部异常说:
根据验证过程,远程证书无效。
这个SDK在底层使用HTTP客户端,但是我没有访问这个对象来配置HttpClientHandler。
我在google上的所有搜索都使用ServicePointManager来绕过SSL验证,但这个解决方案在ASP.NET核心中不起作用。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

有什么方法可以绕过asp.Net核心中的此验证吗?

kzmpq1sx

kzmpq1sx1#

是的,你可以使用下面的代码绕过证书...

HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

// Pass the handler to httpclient(from you are calling api)
HttpClient client = new HttpClient(clientHandler);
pgx2nnw8

pgx2nnw82#

当我在我的开发机器上使用身份服务器(.net core)和web API(.net core)时,我意识到我需要信任localhost的ssl认证。这个命令为我做了这项工作:

dotnet dev-certs https --trust
sg2wtvxw

sg2wtvxw3#

如果您正在添加IHttpClient并通过DI注入,则可以在Startup.cs类上添加配置。

public void ConfigureServices(IServiceCollection services)
        {
services.AddHttpClient("yourServerName").ConfigurePrimaryHttpMessageHandler(_ => new HttpClientHandler
            {
               ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }

            });
}

然后从依赖注入类调用它。

public class MyServiceClass 
    {
private readonly IHttpClientFactory _clientFactory;
public MyServiceClass (IConfiguration configuration, IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
} 

 public async Task<int> DoSomething()
{
var url = "yoururl.com";
var client = _clientFactory.CreateClient("yourServerName");
var result = await client.GetAsync(url);
}
ig9co6j1

ig9co6j14#

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) =>
{
    // local dev, just approve all certs
    if (development) return true;
    return errors == SslPolicyErrors.None ;
};

这个博客帮助了我
https://www.khalidabuhakmeh.com/validate-ssl-certificate-with-servicepointmanager

j0pj023g

j0pj023g5#

这对我很有效
通过提供自定义的HttpClientHandler创建Splunk.Client.Context,绕过SSL无效证书错误。

HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

// Create Context 
Context context = new Context(Scheme.Https, "localhost", 8089, default(TimeSpan), handler);

// Create Service
service = new Service(context);
7lrncoxx

7lrncoxx6#

安装.NET Core SDK会将ASP.NET Core HTTPS开发证书安装到本地用户证书存储区。证书已安装,但不受信任。要信任证书,请执行一次性步骤以运行dotnet dev-certs工具:

dotnet dev-certs https --trust

欲了解更多信息,请访问此链接

f87krz0w

f87krz0w7#

您会遇到此错误,因为您的应用无法验证连接的证书,并且在创建会话/登录令牌的API中使用此错误尤其常见。您可以如上所示以一种危险的方式绕过它,但显然这不是一个好的解决方案,除非您只是在测试。
最好和最简单的解决方案是使用“modernhttpclient-updated" Nuget package,”,它的代码在this GitHub repo中共享,其中也有很多文档。
添加Nuget包后,将NativeMessageHandler传入HttpClient(),如图所示并构建:var httpClient = new HttpClient(new NativeMessageHandler());
现在,您将注意到,您已经删除了该错误,并将得到一个不同的错误消息,如Certificate pinning failure: chain error. ---> Javax.Net.Ssl.SSLPeerUnverifiedException: Hostname abcdef.ghij.kl.mn not verified: certificate: sha256/9+L...C4Dw=
要摆脱这个新的错误消息,您必须将错误中的主机名和证书密钥添加到Pin中,并将其添加到NativeMessageHandler的TLSConfig中,如图所示:

var pin = new Pin();
pin.Hostname = "abcdef.ghij.kl.mn";
pin.PublicKeys = new string[] { "sha256/9+L...C4Dw=" };
var config = new TLSConfig();
config.Pins = new List<Pin>();
config.Pins.Add(pin);
httpClient = new HttpClient(new NativeMessageHandler(true, config)

请记住,您的其他(非令牌生成)API调用可能不实现证书固定,因此它们可能不需要此功能,并且通常它们可能使用不同的主机名。在这种情况下,您也需要将它们注册为pin,或者只是为它们使用不同的HttpClient!

kse8i1jr

kse8i1jr8#

我不得不关闭我的vpn摆脱了这个错误

u91tlkcl

u91tlkcl9#

这很可能是由于代理配置不正确造成的。
不幸的是,一些较新的Windows工作站的这种设置是错误的。
通过在Windows命令提示符下运行以下脚本来检查系统环境变量。
最终,如果您的代理值已配置,但没有任何NO_PROXY设置,则在尝试访问内部服务时将遇到问题。
最后,我建议取消设置HTTP_PROXY和HTTPS_PROXY变量,除非您知道它们的作用以及需要它们的目的。
同样重要的是,检查no_proxy的值,并将其与您的同事进行比较,看看是否有任何差异,有时一个点“.”可以产生差异。

相关问题