【问题标题】:TLS connection handshake FailureTLS 连接握手失败
【发布时间】:2015-01-04 07:04:22
【问题描述】:

我们很难与从我们的 .Net 应用程序中禁用 SSL3 协议的远程机器(如 PayPal vb.)建立 https 连接。 HttpWebRequest 实例的 GetResponse 方法出现以下异常。

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

当我们使用 WireShark 深入跟踪网络日志时,我们看到远程机器返回以下错误

TLSv1.2 警报(级别:致命,描述:握手失败) 握手失败 40

更有趣的情况是当我尝试在互联网浏览器中输入PayPal地址时,它可以成功打开页面,这意味着可以建立连接, 我们也尝试用OpenSSL命令工具连接,结果再次连接成功。

当我们比较 InternetExplorer 和 .Net 应用程序的 WireShark 日志时,我们可以看到 Internet Explorer 发送的可用密码套件比 .Net 应用程序多, 并且 PayPal 正在选择以下 .Net 应用程序请求中没有的密码。

TLS_RSA_WITH_RC4_128_SHA

以下是从 WireShark 捕获的日志:

ServerMachine:.Net 应用程序客户端您好 ServerMachine:.Net 应用程序服务器响应 ServerMachine:InternetExplorer 客户端您好 @ 987654324@ServerMachine:InternetExplorer 服务器你好

以下内容是从我们运行正常的开发机器中捕获的。 DevMachine:.Net 应用程序客户端你好 DevMachine:.Net 应用程序服务器你好

我们认为 PayPal 不喜欢我们根据 .Net 应用程序的“Client Hello”请求发送的密码套件。

更有趣的情况是这个问题只发生在我们运行 Windows 2008 R2 的生产机器上,一切都在我们使用 Windows Server 2008 R2 和 Windows 8 pcs 的开发环境中工作。

请给我们一些想法来解决这个问题。

以下是我们连接 PayPal api 的 C# 代码。

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/2.0/");

wr.Method = "POST";
wr.ContentType = "application/x-www-form-urlencoded";


string output = null;
try
{
    WebResponse wres = wr.GetResponse();
    Stream ress = wres.GetResponseStream();
    StreamReader ressr = new StreamReader(ress, Encoding.UTF8);
    output = ressr.ReadToEnd();
}
catch (System.Net.WebException webEx)
{
    if (webEx.Response != null)
    {
        WebResponse wres = webEx.Response;
        Stream ress = wres.GetResponseStream();
        StreamReader ressr = new StreamReader(ress);
        output = ressr.ReadToEnd();
    }
    else
        throw webEx;

}
catch (Exception ex)
{
    throw ex;
}

最好的问候

【问题讨论】:

  • 您是否在开发中的 Internet 选项中启用了 TLS 1.1 和 1.2,但在生产中没有启用(对于 2k8R2 机器,2012 年的 IIRC,它们默认启用)?
  • 您好 Richard,我在 IE 设置中启用了所有这些,但 .Net 应用程序仍然无法正常工作。
  • 你知道为什么 .Net 没有发送 IE 发送的所需密码
  • 不,我只是在问最明显的可能根本原因。如果不是你需要更了解这个领域的人。
  • 在此处查看 GPEDIT 注释:msdn.microsoft.com/en-us/library/windows/desktop/… - 查看是否列出了 TLS_RSA_WITH_RC4_128_SHA,如果没有添加。 (在公司环境中,如果在域级别应用,您可能需要与管理员交谈)

标签: c# ssl paypal https


【解决方案1】:

我们认为 PayPal 不喜欢我们根据 .Net 应用程序的“Client Hello”请求发送的密码套件。

这是正确的。如果您查看ssllabs,您会看到,api-3t.sandbox.paypal.com 仅支持未包含在您的密码集中的 RC4-SHA (TLS_RSA_WITH_RC4_128_SHA)。

更有趣的情况是这个问题只发生在我们运行 Windows 2008 R2 的生产机器上

可能是您在生产系统中添加了一些强化功能并禁用了 RC4-SHA,因为这种密码被认为是不安全的。请参阅 Microsoft Technet 了解您可能已经实施的匹配建议。

【讨论】:

  • 感谢您的回复 Steffen,ssllabs 报告是查看 PayPal 支持的密码套件的一个很好的资源。当我查看安装我们服务器的更新时,我看到安装了 KB2868725,这导致关闭。但是我们有另一台服务器 2008,也有这个更新,这台电脑运行良好。 :( 我们也可以通过 Internet Explorer 从无法连接 .Net 应用程序的电脑连接到 payPal :( 这是另一个晦涩的问题
  • 您好,这是因为您编写的更新,以及限制 .Net 应用程序使用 RC4 的 .Net 安全更新 2960358(在 .NET TLS 中禁用 RC4 的更新)。感谢您的帮助
猜你喜欢
  • 2021-02-02
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多