通过 Fiddler 从 HttpWebRequest 发送 ClientCertificates

Sending ClientCertificates from HttpWebRequest via Fiddler

我正在尝试发送一个 WebRequest 请求,如 https://identityserver.github.io/Documentation/docsv2/advanced/clientCerts.html 指定的包含客户端证书的处理程序。

我已经确定 ClientCertificate 不是通过 fiddler 发送的,因此在调用 Owin LoadCertificate 时不会在 ServerVariables["CERT_FLAGS"] 中读取它。

所以我已经删除了流程中的所有步骤,除了 (IdentityServer3.Samples/source/Clients/ClientCertificateConsoleClient/Program.cs)

async Task<TokenResponse> RequestTokenAsync()
{
    var cert = new X509Certificate2("Client.pfx");

    var handler = new WebRequestHandler();
    handler.ClientCertificates.Add(cert);

    var client = new TokenClient(
        Constants.TokenEndpoint,
        "certclient",
        handler);

    return await client.RequestClientCredentialsAsync("read write");
}

但我仍然没有在原始请求中的 fiddler 中看到证书。我查看了 HttpWebRequest 的源代码,只看到它处理 GetConnectionGroupLine 中的 ClientCertificate,然后是我在 fiddler 中也看不到的哈希码。我正在使用 Windows 7,我已经打开了 iis 客户端证书映射身份验证,并在 2015 .vs 子文件夹和我的文档中的主要文件夹中启用了 iis express applicationhost 中的设置。我在这里错过了什么?

参考:https://social.msdn.microsoft.com/Forums/en-US/f88a23f2-3dbe-4202-baf2-a5b05b027fe6/httpwebrequest-not-sending-client-certificate-to-server?forum=netfxnetcom https://github.com/IdentityServer/IdentityServer3/issues/3220 - 在 Whosebug 上真的找不到这个..

TLDR:你的问题(此时)是 Fiddler 而不是 HttpWebRequest/dotnet。(编辑澄清。)

  1. Fiddler 不显示包括证书在内的 TLS 信息。Fiddler 处理并以多种格式显示 HTTP 级数据(请求和响应,包括应用程序数据)。当 HTTPS 通过 SSL/TLS 传输此 HTTP 数据时,Fiddler 不会显示特定于 SSL/TLS 的数据,除了服务器和可选的客户端证书(当前)之外,还包括版本、套件、可能的压缩、曲线、格式和下一个协议协商、nonces、临时密钥、重新协商控制、签名算法控制、服务器名称指示、票证和其他加密选项,如 encrypt-then-mac 和 extended-master-secret。 "raw" 选项卡显示所有没有解释的 HTTP 数据,但不显示 SSL/TLS 数据。

  2. Fiddler 不请求客户端身份验证。 一个 SSL/TLS 会话仅在服务器请求时使用客户端证书执行客户端身份验证,当您的客户端连接到真正的 IdentityServer 时,它可能会请求它。但是当使用 Fiddler 时,从客户端到 Fiddler 有一个 SSL/TLS 会话,从 Fiddler 到服务器有一个完全独立的 SSL/TLS 会话。在从您的客户端到 Fiddler 的会话中,Fiddler 不请求客户端身份验证,因此您的客户端不会也不能发送或使用其证书。

  3. 无论如何都无法中继客户端身份验证。如果 Fiddler 确实从您的客户端请求了会话的客户端身份验证,它无法使用该信息来向真实服务器验证会话。客户端身份验证不仅发送客户端证书,它还使用私钥对握手消息的串联(称为转录)进行签名。由于您的客户端和 Fiddler 之间以及 Fiddler 和服务器之间的握手完全不同,因此此签名对于服务器端握手无效并且发送它会(正确地)被服务器拒绝为无效。

  4. 相反 Fiddler 可以进行客户端身份验证。 如果您想通过 Fiddler 使用客户端身份验证来路由 HTTPS 流量,您需要改为配置 Fiddler 以在与服务器的会话中执行客户端身份验证;对于固定设置,您只需将标识证书放在 Fiddler 的配置目录中,对于每个会话设置,您需要编写一些 FiddlerScript。私钥(和链)需要在 Windows 证书存储中,而不是(仅)在文件中。参见:

http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/RespondWithClientCert
https://www.fiddlerbook.com/fiddler/help/httpsclientcerts.asp
Fiddler: Respond to Requests Requiring a Client Certificate(在 SO 上) https://security.stackexchange.com/questions/72916/can-fiddler-decrypt-https-traffic-when-using-elliptic-curves-client-cert-authe

如果您的实际问题是在不使用 Fiddler 的情况下让客户端支持客户端身份验证,则需要将 Fiddler 排除在外并使用其他调试工具,例如网络跟踪。