您好,我在尝试在 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)

微软软件定义网络 这是指

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

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

有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

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

在窗户上那将是

telnet <domainname> 443

如果连接成功,屏幕将变为空白(按几次回车键即可退出)

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

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

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();
...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top