长期读者,第一次海报。
目标:
我们想要创建一个 Owin 自托管 Web API 2 服务,该服务专门使用客户端证书进行身份验证。出于开发目的,数据服务层将与客户端层在同一台机器上运行。
环境/配置:
该服务没有什么复杂的。它确实使用 DelegatingHandler 来验证客户端证书。
场景:
此部署模式已正确配置。正在使用 SSL 证书并且安全性设置为
<access sslFlags="Ssl, SslRequireCert"/>
。此模式也已使用 SSL 证书正确配置,并且需要通过 IIS 管理器设置客户端证书。
SSL 证书已通过 netsh 正确绑定(bind)到端口,设置为“clientcertnegotiation=true”。
配置已将 ClientCredentialType 设置为 Certificate。
SSL Cert 已经通过 netsh 正确绑定(bind)到端口,设置为
clientcertnegotiation=true
。对于服务调用,我们使用 HTTPClient。
操作顺序为:
WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(MyCertificates.OfType<X509Certificate2>).FirstOrDefault(cert => cert.Thumbprint == SelectedCertificateThumbprint) as X509Certificate2);
handler.UseDefaultCredentials = true;
HttpClient client = new HttpClient(handler);
client.BaseAddress = SetServiceBaseAddress(client);
var results = client.PostAsync(<RequestURI>, <RequestDTO>, mediaTypeFormatter).Result;
约束:
我们无权在这些机器上安装 Wireshark 或任何其他网络监控工具。
行为:
服务:
由于 SSL 名称不匹配,
由于 SSL 名称不匹配,
假设:
问题:
最佳答案
我只是忙于一个类似的问题,我想我偶尔会找到你第二个问题的答案。
这完全取决于您使用 netsh 工具将服务器证书绑定(bind)到端口的方式。
将 clientnegotiation 参数设置为 启用 时,如下所示:
netsh http add sslcert ipport=0.0.0.0:443 certhash=<cert_thumbprint> appid={some_guid} clientcertnegotiation=enable
,OWIN 主机开始要求客户端提供某种客户端证书(它可以是任何类型的证书)。
当将该参数设置为 禁用 或只是省略它时,OWIN 主机不需要来自客户端的任何内容。
关于authentication - 403.7 禁止在 Owin 自托管 Web API 2 中使用客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20613658/