我们很难与从.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 application Client Hello ServerMachine:.Net应用服务器响应 ServerMachine:InternetExplorer客户端您好 ServerMachine:InternetExplorer服务器您好
从我们的开发机器中捕获了以下内容,这些机器正常运行。 DevMachine:.Net application Client Hello DevMachine:.Net application Server Hello
我们认为PayPal不喜欢我们发送的密码套件" Client Hello"来自.Net应用程序的请求。
更有趣的情况是这个问题只出现在我们的运行Windows 2008 R2的生产机器上,Everythins正在开发使用Windows Server 2008 R2和Windows 8的开发环境。
请给我们一些解决这个问题的想法。
以下是连接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;
}
最好的问候
答案 0 :(得分:3)
我们认为PayPal不喜欢我们发送的密码套件" Client Hello"来自.Net应用程序的请求。
这是对的。如果查看ssllabs,您会看到,api-3t.sandbox.paypal.com仅支持RC4-SHA(TLS_RSA_WITH_RC4_128_SHA),它不包含在您的密码集中。
更有趣的情况是这个问题仅出现在运行Windows 2008 R2的生产机器上
可能是您已经为生产系统添加了一些强化并禁用了RC4-SHA,因为这种密码被认为是不安全的。有关您可能已实施的匹配建议,请参阅Microsoft Technet。