有关您的问题的详细信息。
我有一个.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)
传递的证书对请求附加了客户端证书(该证书完全按预期出炉,验证有效,依此类推。)>]
但是,当我在带有HttpClient
的调用中调用实际的WebAPI应用程序时,在服务端的request.GetClientCertificate()
行设置了断点,同一行返回null。
这是我尝试过的:
客户证书:
(基本上,跟随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中运行应用程序。
iisClientCertificateMappingAuthentication enabled
设置为“ true”且具有以下访问设置(均无效)的已编辑applicationhost.config:
<access sslFlags="Ssl, SslNegotiateCert" />
<access sslFlags="SslNegotiateCert" />
本地IIS将Web应用设置为在我的本地计算机上的IIS中运行
Ssl, SslNegotiateCert
和SslNegotiateCert
)(通过配置编辑器)[在两种情况下,当使用Web浏览器通过https URL访问Web api时,我都会获得主控制器的索引视图以显示而不会出现问题(因此,服务器端证书是受信任的。)>]
我有一个.NET4.5 WebAPI 2应用程序,该应用程序使用SSL客户端证书进行一些与自定义安全相关的检查。在调试应用程序时,request.GetClientCertificate()对于任何服务调用都返回null,否...
有关您的问题的详细信息。
我将假定问题在于附加带有HttpClient的客户端证书,因为在这种情况下您无法在服务器端查看证书。所有的主机和服务器端证书配置听起来都不错。
我将确保要附加的X509Certificate2 cert
变量是本地证书存储中存在的公共密钥(我不确定将其存储在哪个存储位置)(可以使用mmc进行检查。可执行程序)。还请确保公共密钥具有私有密钥,因为HttpClient将需要公共密钥来签署请求。
在您的代码段中,其余代码之前有using (var handler = new WebRequestHandler())
。确保也在使用中构造HttpClient client = new HttpClient(handler)
,否则处理程序将被处置。
否则处理程序的创建看起来不错。
祝你好运!
我知道它有些旧,但是我遇到了同样的问题,我通过关注此文章https://improveandrepeat.com/2017/07/how-to-configure-iis-express-to-accept-ssl-client-certificates/解决了问题是IIS服务器上的配置,也可以在IIS express上进行修改:-)
有关您的问题的详细信息。
我知道它有些旧,但是我遇到了同样的问题,我通过关注此文章https://improveandrepeat.com/2017/07/how-to-configure-iis-express-to-accept-ssl-client-certificates/解决了问题是IIS服务器上的配置,也可以在IIS express上进行修改:-)