【发布时间】: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,如果没有添加。 (在公司环境中,如果在域级别应用,您可能需要与管理员交谈)