1

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

我收到以下错误

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

2.-操作超时

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

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

WebRequest.GetRequestStream() 

这是否发生在代理后面,请求只能从代理后面的一台 PC 成功发布。代理没有安装客户端证书。

这是在 .net framework 1.1 下,并且请求已经包含网络凭据。

可能是什么?

更新

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

根据 iisper.h文档,此错误属于

//
// 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)

MSDN上,这是指

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

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

4

4 回答 4

1

有很多事情可能会使事情复杂化,例如与 SSL 证书不一致等。但首先,您应该进行一些基本调试以排除明显的事情:

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

-- 您是否尝试从另一台计算机或其他网络连接?您提到客户端在代理后面;首先尝试带代理的计算机,以排除这种情况。

-- 您是否在会话中发出多个 WebRequest?打开请求的数量有硬性限制,因此请确保在获得 WebResponse 后关闭它们。也许只需要一个请求就可以制作一个测试程序。

如果这不能缩小范围,那么可能是更复杂的事情,与他们的服务器或代理有关。您可以使用诸如 netshark 之类的程序来跟踪传出的网络数据包,以尝试找出卡住的地方。

于 2008-11-13T07:00:24.473 回答
1

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

于 2008-11-13T07:16:43.880 回答
1
  • 如果您可以从不同的机器远程登录到 443,那么它不是前两个,因为这意味着客户端机器正在该端口上接收请求。

在窗户上

telnet <domainname> 443

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

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

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

于 2008-11-13T07:20:30.423 回答
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();
...
于 2008-11-13T06:57:20.097 回答