HttpWebRequest.GetRequestStream()在Windows 7 / Vista下的SSL连接上超时

我有一个C#windows应用程序(.Net 3.0 Framework),它使用HttpWebRequest调用PHP Web服务。

Win 7和Vista中 ,如果通过非SSL(即http:// )进行调用,则代码可以正常工作。 当调用更改为调用链接的SSL(https :)版本时,它会在HttpWebRequest.GetRequestStream()超时。 每次都会发生这种情况

当在Windows XP计算机上运行相同的应用程序时,它可以正常使用HTTP或HTTPS URL。

代码确实接受了所有服务器证书代码。 另外,我添加了System.Net日志记录 。 它会写出日志,但因为数据包是加密的,除了Timeout abort语句之外你真的看不到多少。

我也尝试过Fiddler,但再加上加密数据包,我看不太多。 顺便说一句,当我尝试使用Fiddler2解密应用程序挂起时,这样就没有成功。

无论如何,任何帮助将不胜感激。 谢谢。

我会加:

  • 我可以telnet到端口
  • 我尝试以管理员身份运行应用程序
  • 我试过Win XP兼容模式(尝试任何东西)
  • 我已将连接代码单独添加到一个简单的独立应用程序中

在将正在访问的网站迁移到新服务器之后,在工作的C#应用​​程序中出现此错误,这表示存在服务器端问题。 实际上,我们最终通过在Apache配置文件中设置“ServerName”值来匹配证书中注册的域名来解决此问题。 (另一个论坛提到设置“ServerAlias”也可以。)

更具体地说,SSL站点的httpd.conf文件在VirtualHost部分中具有以下内容:

 ServerName www.secure.mydomain.com 

证书已注册到secure.mydomain.com ,我们访问的URL也是https://secure.mydomain.com/test.html

因此,只需将conf文件更改为以下内容并重新启动Apache即可:

 ServerName secure.mydomain.com 

以下内容也很有效,最有可能:

 ServerName www.secure.mydomain.com ServerAlias secure.mydomain.com 

以下是一些其他背景信息,供将来参考:

我们在System.Net.trace.log中看到的两个错误是:

 System.Net.Sockets Error: 0 : [4316] Exception in the Socket#18796293::Receive - A blocking operation was interrupted by a call to WSACancelBlockingCall System.Net Error: 0 : [4316] Exception in the HttpWebRequest#35191196:: - The operation has timed out 

以下是我们尝试的所有未解决问题的事情:

  • 从SSL证书颁发者安装中间证书到Apache(这是必需的)
  • 更改Web请求中的用户代理(无效)
  • 更改服务器端和客户端超时和内存限制(无效)
  • 用静态页面测试(没有效果)
  • 用其他https网站测试(他们工作正常)
  • 将证书添加到受信任的证书存储区(无效)
  • 购买并安装来自其他证书颁发者的证书(无效)
  • 比较从已知工作服务器到问题服务器的虚拟主机.conf文件(这导致我们解决了这个问题)

可以在Opera,IE8和Firefox中打开https URL而不会出现任何问题。 WGET for Windows抱怨证书无效,但是WGET又是一个旧的应用程序,似乎并不信任那么多的证书。

C#客户端应用程序在Windows XP下运行,但在Windows 7或Windows Vista中不运行。 Windows 7和Vista似乎更积极地validation证书。 它们在失败时不提供信息性错误消息,而是在SSL握手期间简单地超时。

也许SSL证书是指CRL需要很长时间才能获取?