Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient是';t使用客户端证书进行相互TLS身份验证 问题:_C#_Authentication_Dotnet Httpclient_Mutual Authentication - Fatal编程技术网

C# HttpClient是';t使用客户端证书进行相互TLS身份验证 问题:

C# HttpClient是';t使用客户端证书进行相互TLS身份验证 问题:,c#,authentication,dotnet-httpclient,mutual-authentication,C#,Authentication,Dotnet Httpclient,Mutual Authentication,为什么我的HttpClient实例不使用我提供的客户端证书进行相互身份验证 背景 我正在使用HttpClient来执行相互TLS。作为客户端,我将向WebRequestHandler添加客户端证书,然后在新的HttpClient中使用该处理程序 证书未安装在我的计算机上。我已成功将其加载到处理程序中,调试时可以看到它(密码也正确) 我正在测试几个不同的测试域 -这将使用找到的证书查找客户端身份验证。这是我目前使用的证书 -此证书只会将提供的任何客户端证书吐出 两个测试应用均显示未发送证书 代

为什么我的HttpClient实例不使用我提供的客户端证书进行相互身份验证

背景 我正在使用HttpClient来执行相互TLS。作为客户端,我将向WebRequestHandler添加客户端证书,然后在新的HttpClient中使用该处理程序

证书未安装在我的计算机上。我已成功将其加载到处理程序中,调试时可以看到它(密码也正确)

我正在测试几个不同的测试域

  • -这将使用找到的证书查找客户端身份验证。这是我目前使用的证书
  • -此证书只会将提供的任何客户端证书吐出
两个测试应用均显示未发送证书

代码
X509Certificate2类看起来没有从PEM证书读取私钥

    var clientCert = new X509Certificate2("badssl.com-client.pem", "badssl.com");
    if(!clientCert.HasPrivateKey)
        throw new ApplicationException("Cert doesn't contain private key");
抛出一个错误


就Badsl.com而言,他们确实有一个PKCS#12证书(又名PFX)。我可以让您的代码使用该证书。

除非证书与服务器在握手过程中发送的CA列表匹配,否则不会发送该证书。因此,请确保它拥有正确的根权限。还要确保您使用的副本实际上包含私钥。谢谢,@JohnW。问题是私钥,但基于我对双方TLS的(有限的)理解,我不认为根权限需要匹配客户端证书。我的轶事经验表明,安装自签名证书时会发送证书。这取决于服务器的配置。在握手过程中,它可以发回CA的列表,客户端应该只使用属于它们的证书进行响应。但它也可以发回一个空列表,客户端可以发送任何内容。正是这些细节使得故障排除变得如此困难。
    var clientCert = new X509Certificate2("badssl.com-client.pem", "badssl.com");
    if(!clientCert.HasPrivateKey)
        throw new ApplicationException("Cert doesn't contain private key");