我正在使用RestSharp将客户端证书发送到我的本地IIS以进行测试。客户端发送证书A:
var client = new RestClient(myHost)
{
ClientCertificates = new X509Certificate2Collection(store.Certificates.Find(X509FindType.FindByThumbprint, myClientThumbprint, true))
};
var request = new RestRequest(myResource, Method.GET);
var response = client.Execute(request);
在我的服务器上,我有一个DelegatingHandler
连接到我的管道,成功在这里调用:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
X509Certificate2 certificate = request.GetClientCertificate();
// ...
}
我在本地发布了我的项目,将IIS配置为接受客户端证书,并且我还设置我的服务器以使用SSL与不同的证书,证书B。
证书A&amp; B安装在Local Computer\My
中,并且都包含私有和公共组件。
当我从具有证书A的客户端应用程序执行我的请求以进行客户端身份验证时,我的服务器的request.GetClientCertificate()
会打开服务器的SSL证书B 而不是客户端的身份验证证书A 。如果我禁用SSL,则检索到的证书为null
。
我尝试调整我的Web.Config以包含sslFlags:
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert"/>
</security>
</system.webServer>
我也试过setting sslFlags="Ssl, SslNegotiateCert"
。
这两个证书都是由受信任的CA创建的,但为了以防万一,我created my own trusted CA并使用它来自签一个公共/私有证书以用于我的客户端证书。
在每种情况下,假定的“客户端证书”都被检索为null或服务器的SSL证书。证书A绝对是我的客户找到的。当我用Fiddler解密HTTPS流量时,我看到一个隧道,用于识别服务器中证书B的使用情况,但没有指示证书A正在传递。 (这并不是说它不是 - 只是我不能证实它是。)
我是否遗漏了一些明显的东西,例如单独或一起证书的性质?或者IIS是否需要允许客户端证书传递的其他配置?
修改: 为了隔离组件,我在测试客户端上删除了我的RestSharp代码,将其替换为:
var req = (HttpWebRequest)WebRequest.Create(myHost + "/" + myResource);
req.ClientCertificates.Add(myClientCertificate);
req.Method = "GET";
var resp = req.GetResponse();
在Fiddler中,我看到以下HTTP隧道:
HTTP/1.1 200 Connection Established
FiddlerGateway: Direct
StartTime: 09:53:50.370
Connection: close
Encrypted HTTPS traffic flows through this CONNECT tunnel. HTTPS Decryption is enabled in Fiddler, so decrypted sessions running in this tunnel will be shown in the Web Sessions list.
Secure Protocol: Tls
Cipher: Aes256 256bits
Hash Algorithm: Sha1 160bits
Key Exchange: ECDHE_RSA (0xae06) 256bits
== Client Certificate ==========
[Subject]
CN=(server's SSL certificate)
[Issuer]
CN=...
(and so on)
...
== Server Certificate ==========
(same as the above 'client' certificate)
同样,我已在VS中确认我的请求已将客户端证书发送到服务器。