我正在尝试使用仅适用于HTTPS的HTTP API。
发送请求时出现以下错误“WebException:请求已中止:无法创建SSL / TLS安全通道。”
我的项目面向.NET Framework 4.7.1
我可以使用Firefox连接到服务器,但我必须添加一个安全例外,我可以导出.crt并安装到我的Windows商店和VS项目。
ServicePointManager.ServerCertificateValidationCallback +=
(message, cert, chain, errors) => true;
ServicePointManager.SecurityProtocol =
SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
handler = new HttpClientHandler();
client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("Connection", "keep-alive");
client.DefaultRequestHeaders.Add("Cache-Control", "max-age=0");
client.DefaultRequestHeaders.Add("username", user);
client.DefaultRequestHeaders.Add("password", password);
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
//handler.ClientCertificates.Add(new X509Certificate(@"./OnSSI.crt"));
handler.ServerCertificateCustomValidationCallback +=
(message, cert, chain, errors) => true;
编辑:有关证书的更多信息来自firefox:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 128bit keys, TLS1.2
PKCS #1 MD5 With RSA Encryption
EDIT2:我认为主要的问题是处理程序没有调用回调验证函数,我在return true参数处添加了一个断点,但它没有命中。
EDIT3:它似乎与.NET核心2.0一起使用,我仍在寻找.NET Framework 4.7中的解决方案
EDIT4:我用代码创建了一个.NET标准库,当我使用.NET框架应用程序启动时,我得到了错误,而我没有使用.NET核心应用程序
答案 0 :(得分:2)
仅使用Tls值设置SecurityProtocol变量,如下所示:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
基本上,似乎.NETCORE通过选择本机Tls版本协议来隐式执行它。 .NETFRAMEWORK不太直观(可移植性要求较低)。