从HTTP请求访问客户端证书

时间:2016-12-01 20:52:52

标签: c# asp.net security x509 mutual-authentication

我正在尝试从HTTP请求访问我的Web API中的客户端证书。我附上证书如下:

X509Certificate2 clientCert = GetClientCertificate();   
HttpWebRequest request  = (HttpWebRequest)WebRequest.Create("https://localhost:44366/test");                        
request.KeepAlive = true;
request.Method = "GET";
request.Accept = "application/json";
request.ClientCertificates.Clear();
request.ClientCertificates.Add(clientCert);
var response = (HttpWebResponse) request.GetResponse();  

GetClientCertificate()访问本地安装的证书。从我的WebApi内部,我有以下路线:

[HttpGet]
[Route("test")]
public HttpResponseMessage TestNoAuth()
{
    X509Certificate2 cert = Request.GetClientCertificate();
    return cert == null ? Request.CreateResponse(HttpStatusCode.BadRequest, "No cert") : Request.CreateResponse(HttpStatusCode.OK, "Cert attached");
}                                                              

无论我尝试什么,cert总会回来null。我是否错误地附加了证书,或者尝试错误地访问它?我已经用这条测试路线创建了一个全新的WebAPI,以确保我们的开发API中没有可能存在冲突的设置。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

确保您的web.config正确地将sslFlags设置为SslNegotiateCert

  <system.webServer>
    <security>
        <access sslFlags="SslNegotiateCert" />
    </security>
  </system.webServer>

如果没有此设置,将忽略附加到请求的任何证书,有关详细信息,请参阅this

有很多关于在Andras Nemes中使用.NET的客户端证书的文章。在this one中详细介绍了如何为本地测试使用设置客户端证书。

答案 1 :(得分:0)

您必须在IIS中设置客户端证书设置。一旦你这样做了 请确保将证书链中的任何中间证书添加到受信任的根存储。 此WebApi应该能够收到证书。