通过来自.Net应用程序的客户端证书使用身份验证发送https请求会导致“System.IO.IOException:身份验证失败,因为远程方已关闭传输流”错误。
具有相同客户端证书的相同请求适用于邮递员以及curl。
相同的.Net应用程序适用于其他环境。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var url = "https://yyyyyyyy:8081/xxxxxxxxx;
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
X509Certificate2 cert = new X509Certificate2();
cert.Import("zzzzzz.pfx");
if (!cert.HasPrivateKey) throw new Exception("Certificate has no private key");
request.ClientCertificates.Add(cert);
if (request.ClientCertificates.Count != 1) throw new Exception("Certificate not loaded");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Bumm!!
未处理的异常:System.Net.WebException:基础连接已关闭:发送时发生意外错误。 ---> System.IO.IOException:身份验证失败,因为远程方已关闭传输流。
仅供参考,使用curl发出相同的查询工作没有任何问题:
curl --tlsv1.2 -v \
--cacert ca_crt.pem \
--cert cert.pem \
--key key.pem \
https://yyyyyyyy:8081/xxxxxxxxx
并使用以下密码套件:
* SSL connection using TLS_RSA_WITH_AES_256_CBC_SHA
解决了!问题是缺少密码'TLS_RSA_WITH_AES_256_CBC_SHA256'(由于安全规则.....)