请求被中止: 未能创建 SSL/TLS 安全通道。该怎么解决
使用第三方sdk调用接口返回区块链异常。查看日志显示未能创建 SSL/TLS 安全通道。
之前出过这个问题,在网上搜的加这几行代码
结果不管用,后来通过设置iis应用程序池“加载用户配置文件” 改为True 就正常了。这次又出现这个问题,之前的操作都试过了不管用。
证书以证书链的形式组织,在颁发证书的时候首先要有根CA机构颁发的根证书,再由根CA机构颁发一个中级CA机构的证书,最后由中级CA机构颁发具体的SSL证书。
我们可以这样理解,根CA机构就是一个公司,根证书就是他的身份凭证,每个公司由不同的部门来颁发不同用途的证书,这些不同的部门就是中级CA机构,这些中级CA机构使用中级证书作为自己的身份凭证,其中有一个部门是专门颁发SSL证书,当把根证书,中级证书,以及最后申请的SSL证书连在一起就形成了证书链,也称为证书路径。
在验证证书的时候,浏览器会调用系统的证书管理器接口对证书路径中的所有证书一级一级的进行验证,只有路径中所有的证书都是受信的,整个验证的结果才是受信。
根证书是最关键的一个证书,如果根证书不受信任,它下面颁发的所有证书都不受信任。操作系统在安装过程中会默认安装一些受信任的 CA 机构的根证书。
根证书的有效期长,支持的用途多以方便颁发不同用途类型的中级证书;中级证书用途单一,有效期相对短一些,但是比具体的 SSL 证书要长很多。
如果 SSL 证书验证失败根据浏览器的不同会有不同的错误提示,验证失败原因也会给出提示。
根据异常信息提示为未能创建 SSL/TLS 安全通道,可以初步判断是证书方面的问题。具体解决方案如下:
``` using System.Net; ...
var request = WebRequest.Create("https://example.com"); var cert = (request as HttpWebRequest)?.ServicePoint.Certificate; if (cert != null) { Console.WriteLine(cert.GetExpirationDateString()); } ```
查看证书是否由受信任的证书颁发机构颁发,如果不是,可以手动将该证书添加到受信任的根证书颁发机构列表中。
确认证书是否配置正确,如证书的主机名是否与代码或Web站点的预期主机名匹配。
如果证书需要密码,则需要在代码中设置密码:
``` using System.Security.Cryptography.X509Certificates; ...
var cert = new X509Certificate2("certificate.pfx", "password"); ```
确认代码中使用的协议版本是否与服务器配置的一致,例如 TLS 1.2。
如果以上步骤都没有解决问题,可以尝试禁用 TLS/SSL 版本,看是否有其他版本可以正常连接:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; # disable SSL 2 and SSL 3 ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3; ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl2;
如果以上解决方法都不能解决问题,则需要进一步排查问题所在。