【问题标题】:Accessing client certificates from an HTTP Request从 HTTP 请求访问客户端证书
【发布时间】:2016-12-01 20:52:52
【问题描述】:

我正在尝试通过 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 中没有可能存在的冲突设置。任何帮助将不胜感激。

【问题讨论】:

  • @Beorn 如果您使用的是 IIS - 转到“SSL 设置”并确保客户端证书是“接受”而不是“忽略”(默认值)。如果它设置为忽略 - 无论您做什么,证书都将为空。
  • @Evk 已经试过了,证书还是空
  • @Beorn 然后很难进一步提供帮助,因为我测试了问题中提供的代码并且它工作正常(如果您设置“接受”设置)。很好,我的意思是,在我的情况下,如果证书无效,它至少会引发异常。也许您可以生成一些您遇到问题的测试证书并将其发布到某个地方?

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-24
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2015-03-05
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多