调试失败的HTTPS WebRequest

Dav*_*all 11 .net c# https httpwebrequest x509certificate

我正在编写一个小程序,它将使用HTTPS和HttpWebRequest类向服务器发出GET请求.服务器(显然)有一个服务器证书.它还希望客户提供证书.

但是,在发出请求时,我收到一个System.Net.WebException,指出无法建立安全的TLS/SSL连接.我很快发现服务器的证书无效.假设这是造成异常的原因,我试图接受无效证书(遗憾的是,更新证书不是一个选项),使用下面的代码:

ServicePointManager.ServerCertificateValidationCallback += delegate {
    return true;
};
Run Code Online (Sandbox Code Playgroud)

然而,这并没有解决问题.

由于异常没有给出任何细节,因此很难确定导致它的原因.我是否试图覆盖无效的服务器证书不起作用?我提供的客户端证书是否不受服务器信任?我没有以正确的方式加载客户端证书吗?

我喜欢有关如何调试此类问题的提示.遗憾的是,我无法访问服务器或其日志.

以下是代码的重要部分:

ServicePointManager.ServerCertificateValidationCallback += delegate {
    return true;
};
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); // url is an HTTPS URL.
X509Certificate clientCert = new X509Certificate("certificate.crt", "password");
req.ClientCertificates.Add(clientCert);
WebResponse resp = req.GetResponse(); // This fails!
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 16

对它进行一些追踪!在调试这些东西时,Traces是你最好的朋友.我曾经有一个客户端无法连接到我们启用SSL的服务.使用跟踪我发现有人将系统时钟移到我们的证书到期日期之后.但我离题了.

启用所有适用的跟踪源,并查看日志中是否显示有趣的内容.

Durgaprasad Gorti 有一篇古老的(2005年)但很棒的帖子,你应该看看.它将向您显示要添加的内容,并在其中使用自定义验证回调显示一些SSL跟踪.

来自同一篇博文的示例app.config:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" />
    <sources>
      <source name="System.Net">
        <listeners>
          <add name="MyTraceFile"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add
      name="MyTraceFile"
      type="System.Diagnostics.TextWriterTraceListener"
      initializeData="System.Net.trace.log"
    />
    </sharedListeners>

    <switches>
      <add name="System.Net" value="Verbose" />
    </switches>

  </system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)

希望这能为您提供更多数据.