“请求被中止:无法创建 SSL/TLS 安全通道”第一次访问 API 时

Posted

技术标签:

【中文标题】“请求被中止:无法创建 SSL/TLS 安全通道”第一次访问 API 时【英文标题】:"The request was aborted: Could not create SSL/TLS secure channel" When hitting the API for first time 【发布时间】:2019-09-09 16:30:35 【问题描述】:

我正在尝试从 Web API 使用客户端的 Web 服务,下面是我们目前用来绕过 SSL 证书的代码

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

它工作正常,直到他们最终禁用 TLS 1.0 和 TLS 1.1。现在我们添加了以下代码以使用 TLS 1.2 进行客户端服务器连接

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

现在我收到“请求已中止:无法创建 SSL/TLS 安全通道。”仅在我第一次点击 API 时出错,然后如果我连续点击 API 会得到结果,如果我等待大约一分钟左右的时间,只会在第一次出现同样的错误。

【问题讨论】:

您使用的是什么框架,您在应用程序的哪个位置设置了 ServicePointManager.SecurityProtocol? 能否禁用 ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 并调试回调以查看 sslPolicyErrors?这可能会让您对这个问题有所了解。 嗨 Martennis,我正在使用框架 4.5.2,我们正在使用从 wsdl 生成的代理类并在调用他们的方法之前设置 ServicePointManager.SecurityProtocol。 嗨臭臭,调试不是我们的选项,只有一个 IP 被列入服务白名单,我们没有开发环境,虽然我尝试从 SOAPUI 5.4.0 访问服务,但出现以下错误对于第一个请求也只有那里错误:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure @Soniya - 如果无法调试,您如何更新 ServicePointManager 【参考方案1】:

需要在创建发布请求之前设置安全协议类型。所以这个:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

应该出现在此之前:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

因此,如果您看到它在后续请求中起作用,则可能是您设置协议为时已晚。

【讨论】:

谢谢!为我解决了:) @RushabhMaster 您应该接受答案,然后他们才能获得信用。 @Shane,最初的问题不是我提出的,我赞成这个答案,因为它在我的情况下有效,不过感谢您的评论!【参考方案2】:

以下代码可用于帮助解决问题。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback += ValidateServerCertificate;

...

private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)

    // If the certificate is a valid, signed certificate, return true to short circuit any add'l processing.
    if (sslPolicyErrors == SslPolicyErrors.None)
    
        return true;
    
    else
    
        // cast cert as v2 in order to expose thumbprint prop - if needed
        var requestCertificate = (X509Certificate2)certificate;

        // init string builder for creating a long log entry
        var logEntry = new StringBuilder();

        // capture initial info for the log entry
        logEntry.AppendFormat("SSL Policy Error(s): 0 - Cert Issuer: 1 - SubjectName: 2",
           sslPolicyErrors.ToString(),
           requestCertificate.Issuer,
           requestCertificate.SubjectName.Name);

        // check for other error types as needed
        if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) //Root CA problem
        
            // check chain status and log
            if (chain != null && chain.ChainStatus != null)
            
                // check errors in chain and add to log entry
                foreach (var chainStatus in chain.ChainStatus)
                
                    logEntry.AppendFormat("|Chain Status: 0 - 1", chainStatus.Status.ToString(), chainStatus.StatusInformation.Trim());
                
            
        

        // replace with your logger
        MyLogger.Info(logEntry.ToString().Trim());
    

    return false;

【讨论】:

HttpWebRequest 结合使用时返回false 的结果是WebExceptionStatus 的关联WebExceptionStatus.TrustFailure【参考方案3】:

对于那些运行 .NET 版本 4 的人,他们可以在下面使用

ServicePointManager.SecurityProtocol = CType(768, SecurityProtocolType) Or CType(3072,SecurityProtocolType)
ServicePointManager.Expect100Continue = True

【讨论】:

以上是关于“请求被中止:无法创建 SSL/TLS 安全通道”第一次访问 API 时的主要内容,如果未能解决你的问题,请参考以下文章

请求被中止:无法为 HttpWebRequest 创建 SSL/TLS 安全通道

Braintree 中的“请求被中止:无法创建 SSL/TLS 安全通道”错误

请求被中止:无法创建 SSL/TLS 安全通道 - 没有证书

错误 Paypal 沙箱:请求被中止:无法创建 SSL/TLS 安全通道

请求被中止:无法创建 SSL/TLS 安全通道。

发出请求时出错:请求被中止:无法创建 SSL/TLS 安全通道