小编dol*_*mir的帖子

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

我有一个.NET4.5 WebAPI 2应用程序,它使用SSL客户端证书进行一些自定义安全相关检查.

在调试应用程序时,无论我到目前为止尝试了什么,都会request.GetClientCertificate()返回null任何服务调用.

经测试的代码:

基本上,在我的服务方面,我有一个类似这样的方法:

class CertificateChecker : ICertificateChecker
{
    public bool Check(HttpRequestMessage request)
    {
        var cert = request.GetClientCertificate();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的单元使用request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert)传递附加到请求的客户端证书进行测试(证书完全符合预期,验证工作,等等).

但是,当我使用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以下方式附加客户端证书(没有一个工作):

  • 使用WebRequestHandlerClientCertificateOptions设置为手动,并添加到该证书ClientCertificates集合.

    using (var handler = new WebRequestHandler())
    {
         var cert = GetTestCert();
         handler.ClientCertificateOptions = ClientCertificateOption.Manual;
         handler.ClientCertificates.Add(cert);
    
         // and so on...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用HttpRequestMessage,将cert添加为具有密钥集的属性HttpPropertyKeys.ClientCertificateKey(此方法在如上所述的单元测试时起作用).

    request.Properties.Add(HttpPropertyKeys.ClientCertificateKey, cert);
    
    Run Code Online (Sandbox Code Playgroud)

在两种情况下, …

c# iis ssl-certificate iis-express asp.net-web-api

8
推荐指数
1
解决办法
8275
查看次数

标签 统计

asp.net-web-api ×1

c# ×1

iis ×1

iis-express ×1

ssl-certificate ×1