【发布时间】:2014-04-02 16:49:04
【问题描述】:
我有一个 .NET4.5 WebAPI 2 应用程序,它使用 SSL 客户端证书进行一些自定义安全相关检查。
在调试应用程序时,request.GetClientCertificate() 会为任何服务调用返回 null,无论我到目前为止尝试了什么。
经过测试的代码:
基本上,在我的服务方面,我有一个类似这样的方法:
class CertificateChecker : ICertificateChecker
{
public bool Check(HttpRequestMessage request)
{
var cert = request.GetClientCertificate();
}
}
我的单元测试使用request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert) pass 附加到请求的客户端证书(证书完全符合预期,验证工作等等)。
但是,当我使用 HttpClient 调用实际 WebAPI 应用程序的测试时,在服务端的 request.GetClientCertificate() 行设置断点时,同一行返回 null。
这是我尝试过的:
客户证书:
- 创建了一个假 CA 并将其放入受信任的 CA 存储中(尝试了 LocalMachine 和当前用户)。
- 创建了一个由该假 CA 签名的客户端身份验证 (1.3.6.1.5.5.7.3.2) 证书并将其放入个人存储区(LocalMachine 和当前用户)。
(基本上,关注https://www.piotrwalat.net/client-certificate-authentication-in-asp-net-web-api-and-windows-store-apps/和类似博客)
在我使用HttpClient 调用服务的测试中,通过以下方式附加客户端证书(均无效):
-
使用
WebRequestHandler并将ClientCertificateOptions设置为手动,并将证书添加到ClientCertificates集合中。using (var handler = new WebRequestHandler()) { var cert = GetTestCert(); handler.ClientCertificateOptions = ClientCertificateOption.Manual; handler.ClientCertificates.Add(cert); // and so on... } -
使用
HttpRequestMessage,将证书添加为属性,并将密钥设置为HttpPropertyKeys.ClientCertificateKey(这种方法在上述单元测试时有效)。request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert);
cert 变量在这两种情况下都设置为预期的X509Certificate2 对象。
托管:
-
IISExpress:尝试在 IISExpress 中运行应用程序。
编辑 applicationhost.config 并将
iisClientCertificateMappingAuthentication enabled设置为“true”和以下访问设置(均无效):<access sslFlags="Ssl, SslNegotiateCert" /> <access sslFlags="SslNegotiateCert" /> -
本地 IIS 将 Web 应用设置为在我的本地计算机上的 IIS 中运行
- IIS 中的站点使用受信任的证书配置了 HTTPS 绑定。
- Web 应用程序配置为使用 https 协议并启用 IIS 客户端证书映射身份验证。
- 尝试了两种访问选项组合(
Ssl, SslNegotiateCert和SslNegotiateCert)(通过配置编辑器)
在这两种情况下,当使用 web 浏览器通过 https url 访问 web api 时,我可以毫无问题地显示家庭控制器的索引视图(因此,服务器端证书是可信的)。
【问题讨论】:
标签: c# iis asp.net-web-api ssl-certificate iis-express