无法在.net中发布https WebRequest?

时间:2008-11-13 06:30:53

标签: .net proxy networking webrequest client-certificates

您好我遇到了尝试在Https下发布WebRequest的问题。

我收到以下错误

1.-底层连接已关闭:无法连接到远程服务器。

2.-操作TimeOut

3 - 基础连接已关闭:无法为SSL / TLS建立安全通道。

我尝试使用我公司和客户公司的大约3或4个不同的代理,即使我直接与ISP提供商没有任何限制,我在执行以下方法时也会遇到上述错误

WebRequest.GetRequestStream() 

这发生在代理服务器之后,请求只能在代理服务器后面的一台PC上成功发布。代理没有安装客户端证书。

这是在.net框架1.1和 该请求已包含网络凭据。

可能是什么?

更新

内部异常第三个错误如下:  该函数已成功完成,但必须再次调用才能完成上下文

根据iisper.h documentation此错误属于

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

on MSDN这指的是

SEC_I_CONTINUE_NEEDED  客户端必须将输出令牌发送到服务器并等待返回令牌。然后,返回的令牌在另一个调用InitializeSecurityContext(Schannel)中传递。输出标记可以为空。

这是否意味着PC缺少客户证书?

4 个答案:

答案 0 :(得分:1)

对于SSL证书的不一致等,有很多事情可能会使事情变得复杂。但首先,你应该做一些基本的调试来排除明显的事情:

- 您是否尝试向其他服务器发送简单的Web请求?尝试(不安全)http和(安全)https

- 您是否尝试从其他计算机或其他网络进行连接?你提到客户端在代理之后;首先尝试没有代理的计算机来排除这种情况。

- 您是否在会话中制作了多个WebRequests?打开请求的数量有一个硬限制,因此请确保在获得WebResponse后关闭它们。也许只用一个请求制作一个测试程序。

如果这不会缩小范围,那么它可能更复杂,包括服务器或代理。您可以使用netshark等程序跟踪传出的网络数据包,以尝试追踪卡住的位置。

答案 1 :(得分:1)

您可以使用Fiddler或网络数据包嗅探工具(例如Ethereal Whireshark)在其工作的计算机上以及其他计算机上跟踪HTTP流量,并比较结果。这是相当低级的,但可能会对这个问题有所了解。

答案 2 :(得分:1)

  • 如果您可以从不同的计算机远程登录到443,那么它不是前两个,因为这意味着客户端计算机正在该端口上接收请求。

在Windows上

telnet <domainname> 443

如果它连接屏幕将变为空白(点击返回几次退出)

  • 代理可能会或可能不会真正关心您的请求,如果它是在HTTPS下,因为他们无法读取它。

  • 其他计算机是否安装了客户端证书和证书链?

答案 3 :(得分:0)

SSL证书名称可能不匹配。自签名证书通常就是这种情况。

解决方案是编写您自己的身份验证例程,您可以始终返回true或进行必要的身份验证以确保证书有效。

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...