当前位置: 首页 > 知识库问答 >
问题:

如何在 .net core 2.1 中忽略 SSL 验证

西门品
2023-03-14

我正在尝试调用一个部署在Linux服务器上的web服务,该服务器具有在.net core中开发并部署在IIS服务器(Windows Server 2012)上的应用程序的自签名证书。

但是当我试图调用endpoint时,抛出了下一个错误:

“消息”: “无法建立 SSL 连接,请参阅内部异常。”, “描述”: “内部错误: 系统.安全.身份验证.身份验证异常: 身份验证失败,请参阅内部异常。---

我已经尝试了下一个解决方案,但它们不起作用。

解决方案1:

          using (var httpClientHandler = new HttpClientHandler())
        {
            httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
            // Make your request...
            //send request
            using (var httpClient = new HttpClient(httpClientHandler))
            {

                var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                HttpResponseMessage response = await httpClient.PostAsync(_url, content);
                //var res = await response.Content.ReadAsAsync<T>();


            }


        }

解决方案2:

            //send request
        using (var httpClient = new HttpClient())
        {
             ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
            var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
            HttpResponseMessage response = await httpClient.PostAsync(_url, content);

        }

解决方案3:尝试导入证书,然后进行调用,但仍然不起作用。

const string certPath = @"C:\soaProdcer.cer";    
var handler = new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual,
                SslProtocols = System.Security.Authentication.SslProtocols.Tls
            };
            handler.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate(certPath));

            //send request
            using (var httpClient = new HttpClient(handler))
            {
                var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                HttpResponseMessage response = await httpClient.PostAsync(_url, content);

            }

我使用OpenSSL获得了证书

>openssl s_client -showcerts -connect serversoa:443

No client certificate CA names sent
---
SSL handshake has read 774 bytes and written 493 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-SHA
    Session-ID: 4E0F69C75B8F041101562F7E9B3EA349
    Session-ID-ctx:
    Master-Key: 61A916A9B8AF26281B5F7A0138DF5E4C2A4B83995E0B3FDD2274BAD0D8E3C2B5E98AA7CCB48A6543F6814C2540B18848
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1558979896
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)

我将IIS服务器中的证书导入到受信任的根证书颁发机构中。

共有3个答案

任绪
2023-03-14

该错误并不表示证书CA颁发机构有问题,而是来自服务器的一个响应,该响应不是建立TLS所期望的。

正如作者已经弄清楚客户端支持的1.2和服务器1.0一样,它导致了麻烦。

附言我建议仅使用TLS 1.2,如果这是您需要处理的浏览器支持选项。(只有旧版本不支持 1.2。

潘智刚
2023-03-14

正如 Ilya 所说,这不是证书 CA 颁发机构的问题。问题是客户端尝试使用不同版本的 TLS (1.2) 解决方案是指定 TLS 版本。

using (var httpClientHandler = new HttpClientHandler())
            {
                httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
                httpClientHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls;
                //send request
                using (var httpClient = new HttpClient(httpClientHandler))
                {
                    var content = new StringContent(body, Encoding.UTF8, "application/soap+xml");
                    HttpResponseMessage response = await httpClient.PostAsync(_url, content);

                }
            }

我用Wireshark嗅探交通,看看发生了什么。。。

在我的计算机中完成测试并且测试成功后,我将应用程序部署在 IIS 服务器上。当我开始在服务器上测试我的应用程序时,它开始抛出与以前相同的异常。

为什么?

因此,如果您像我一样使用Windows,则只需检查证书使用的密码即可。正如我之前提到的,Linux 服务器在证书中使用了 CR4 密码

蒋默
2023-03-14

我不记得微软告诉你的确切链接了。上述解决方案适用于较旧的 asp.net 核心版本。这是我的解决方案,其中包含我为我的项目实施的最新 ASP.NET 核心。我希望它对你有所帮助。

services.AddHttpClient<IYourService, YourService>()
    .ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
    {
        AllowAutoRedirect = false,
        ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true,
        SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12
    });

也请阅读关于HttpClientFactory:https://learn . Microsoft . com/en-us/dot net/standard/micro services-architecture/implement-resilient-applications/use-HttpClientFactory-to-implement-resilient-http-requests

 类似资料:
  • 问题内容: 我必须使用无效的SSL证书调用Web服务器上托管的HTTP服务。在开发人员中,我使用 keytool 导入证书,但是证书在每个客户端安装中都会有所不同,因此我不能将其捆绑在一起。 前言:我 不要 知道跳过SSL验证实在是太丑了。在这种特定情况下,我什至不需要SSL,并且系统中的所有其他通信都是通过简单HTTP进行的。所以我真的不在乎MITM攻击之类。攻击者无需破坏SSL,因为数据没有S

  • 我试图使用Groovy使用Rest API,这里是我使用的代码: 问题是,每次我执行它时,它都会向我显示一个错误: 如何在Groovy中使用SSL和自签名证书? 所有这些都不起作用,有什么帮助吗?

  • 我正在开发一个应用程序,使用rest API将其连接到数据库,我的服务器有一个SSL证书,当我试图发送请求时,从我的反应本地应用程序显示此错误msg是有办法禁用SSL验证反应原生Android。 如果有人知道,帮忙。

  • 如何忽略Apache HttpClient4.3的SSL证书(信任所有证书)? null 仅用于测试目的。孩子们,不要在家里(或生产中)尝试

  • 这应该很容易做到。我可以在Guzze3中找到很多关于如何做到这一点的参考资料,但是它们在Guzze5中不起作用。 我目前正在做的事情: 当我发送请求时,我收到了这个错误: 我在谷歌上找不到任何关于这个错误的有用参考。如果我可以访问旋度选项,那么我可以尝试类似这里建议的解决方案(这是针对Guzzle 3的,因此它不起作用):http://inchoo.net/dev-talk/symfony2-gu