我正在尝试调用一个部署在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服务器中的证书导入到受信任的根证书颁发机构中。
该错误并不表示证书CA颁发机构有问题,而是来自服务器的一个响应,该响应不是建立TLS所期望的。
正如作者已经弄清楚客户端支持的1.2和服务器1.0一样,它导致了麻烦。
附言我建议仅使用TLS 1.2,如果这是您需要处理的浏览器支持选项。(只有旧版本不支持 1.2。
正如 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 密码
我不记得微软告诉你的确切链接了。上述解决方案适用于较旧的 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