HttpRequestMessage.GetClientCertificate()在Web API中返回null

问题描述 投票:8回答:2

我有一个.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。

这是我尝试过的:

客户证书:

在我的使用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中运行

    • IIS中的站点已使用受信任的证书配置了HTTPS绑定。
    • Web应用程序配置为使用https协议并启用IIS客户端证书映射身份验证。
    • 尝试了两种访问选项组合(Ssl, SslNegotiateCertSslNegotiateCert)(通过配置编辑器)

[在两种情况下,当使用Web浏览器通过https URL访问Web api时,我都会获得主控制器的索引视图以显示而不会出现问题(因此,服务器端证书是受信任的。)>]

我有一个.NET4.5 WebAPI 2应用程序,该应用程序使用SSL客户端证书进行一些与自定义安全相关的检查。在调试应用程序时,request.GetClientCertificate()对于任何服务调用都返回null,否...

有关您的问题的详细信息。

我将假定问题在于附加带有HttpClient的客户端证书,因为在这种情况下您无法在服务器端查看证书。所有的主机和服务器端证书配置听起来都不错。

  1. 我将确保要附加的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上进行修改:-)

    c# iis asp.net-web-api ssl-certificate iis-express
    2个回答
    1
    投票

    有关您的问题的详细信息。


    0
    投票

    我知道它有些旧,但是我遇到了同样的问题,我通过关注此文章https://improveandrepeat.com/2017/07/how-to-configure-iis-express-to-accept-ssl-client-certificates/解决了问题是IIS服务器上的配置,也可以在IIS express上进行修改:-)

    © www.soinside.com 2019 - 2024. All rights reserved.