request.GetClientCertificate在特定服务器上返回null

时间:2014-06-26 16:57:36

标签: asp.net-mvc security ssl x509certificate restful-architecture

我在ASP.NET Web API 2应用程序中使用客户端证书身份验证。我将证书附加到客户端,如下:

    private HttpClient GetHttpClient()
    {
        HttpClient client = new HttpClient(GetRequestHandler());
        client.BaseAddress = new Uri(_apiBaseUrl);
        return client;
    }

    private WebRequestHandler GetRequestHandler()
    {
        WebRequestHandler wrh = new WebRequestHandler();
        X509Certificate cert = GetClientCert();
        wrh.ClientCertificates.Add(cert);
        return wrh;
    }

    private X509Certificate GetClientCert()
    {
        X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        certStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
        X509Certificate cert = certStore.Certificates.Find(X509FindType.FindBySubjectName, _certName, false)[0];
        certStore.Close();
        return cert;
    } 

当我调试它时,我可以看到cert对象是我所期望的。在服务器上的Web API中,我正在使用它:

public class CertAuthHandler : DelegatingHandler
{
    private ICertValidator _certValidator;

    public CertAuthHandler(ICertValidator certValidator)
    {
        this._certValidator = certValidator;
    }

    public CertAuthHandler() : this(new LoggingCertValidator()) { }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var cert = request.GetClientCertificate();
        if (_certValidator.IsValid(cert))
        {
            return base.SendAsync(request, cancellationToken);
        }
        return Task<HttpResponseMessage>.Factory.StartNew(() => request.CreateResponse(HttpStatusCode.Unauthorized));
    }
}

这在我们的TEST服务器上完全按预期工作;但是在我们的DEV服务器上,我添加的用于排除故障的日志记录显示request.GetClientCertificate()返回null。我进行了两次和三次检查,IIS已设置为接受客户端证书;当我将其更改为需要ssl并要求客户端证书时,它返回403.如果重要,则将Web API设置为DEV和TEST中主网站的子应用程序。

我还有一些队友从他们的机器上尝试客户端,以确保它与我的机器上的证书安装方式无关(我们使用不同的DEV和TEST证书);他们也获得了401.我使用相同的DEV证书来调用具有相同安全设置的另一个API,并且它没有问题,所以它似乎是服务器特定的。我的问题是,我可以在DEV服务器上看到什么可能导致证书无法通过请求?我无法在服务器的事件日志中找到与此相关的任何内容,除了我自己添加到API的自定义日志记录。非常感谢任何帮助。

0 个答案:

没有答案