客户端证书在相互 TLS 1.2 握手期间不匹配

问题描述

我正在通过双向 TLS 1.2 连接将请求从 .NET WCF 客户端发送到服务。

在客户端上,我使用自己的根 CA 创建了一个新证书。我将此证书加载到客户端的证书存储中。相同的证书文件已复制到服务器并加载到信任存储中,以便服务可以获取它。

代码中,我使用 SecurityMode.TransportWithMessageCredential 创建 WSHttpBinding 并设置 ClientCredentialType = HttpClientCredentialType.Certificate

现在我正在调试客户端,同时使用 Wireshark 观察 TLS 1.2 数据包交换。我可以看到客户端应用在商店中找到我的证书并将其分配给代理上的 ClientCredentials.ClientCertificate.Certificate 属性

但请求尝试失败并显示消息

“请求被中止:无法创建 SSL/TLS 安全通道。”

Wireshark 显示 TLS 1.2 握手消息交换一直持续到服务发送证书请求专有名称与我的客户端证书完全匹配.

enter image description here

但不幸的是,客户端返回空证书列表!当然,服务在此之后终止握手。

这是我的客户证书:

enter image description here

enter image description here

这是来自服务的证书请求:

enter image description here

这是客户的回应:

enter image description here

客户端应用程序拥有此证书,为什么在服务器的证书请求时不返回此证书?

更新:

在发布我的问题几天后,我在早些时候遇到了这个问题 question and solution。我显然有同样的问题,我在本地证书存储中的证书没有私钥。所以我按照指示创建了 .pfx,现在客户端和服务器在各自的本地存储中都有另一个带有私钥的证书。不幸的是,问题没有解决,症状仍然相同。

解决方法

使用 X509CertificateInitiatorClientCredential.SetCertificate 方法指定客户端使用的证书。输入正确的参数值,如下所示:

client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser,StoreName.My,X509FindType.FindBySubjectName,"alice");