5

我已经使用此处提供的说明配置了一个 Azure 网站(带有一个ApiController)以使用客户端证书身份验证。总结:您在网站上设置标志并从那时起开始要求客户端身份验证证书。clientCertEnabledtrue

效果很好,但是,现在我想访问发送到服务器的客户端证书。根据 MSDN 文章,它应该在X-ARR-ClientCert请求标头中可用,但它不是!

这意味着任何拥有客户端身份验证证书的人都可以访问我的 API,这在我的情况下是不可取的。

那么如何检索客户端发送到我的 Web API 的客户端身份验证证书呢?

更新 1:我实际上是通过Azure API Management调用我的 API 。我用我的客户端身份验证证书配置了 APIM,APIM 调用我的 API 没有问题。但是,当从 APIM 调用 API 时,不会设置 X-ARR-ClientCert 标头。当通过 Fiddler 直接调用时,我确实看到了标题。所以 APIM 以某种不同的方式调用我的 API?!?

更新 2:我再次检查了所有内容并生成了一些日志记录。DelegatingHandler首先是我正在登录的课程的相关部分:

protected override async Task<HttpResponseMessage>
    SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  Trace.TraceInformation("Going to validate client certificate.");

  var x509Certificate2 = request.GetClientCertificate();
  Trace.TraceInformation("Client cert: {0}", x509Certificate2 == null
    ? "<null>"
    : x509Certificate2.Subject);

  try
  {
    var headerKeys = string.Join("|", request.Headers.Select(h => h.Key));
    Trace.TraceInformation("Header keys: {0}", headerKeys);
  ...

结果日志输出:

2015-12-07T08:08:24  PID[8464] Information Going to validate client certificate.
2015-12-07T08:08:24  PID[8464] Information Client cert: <null>
2015-12-07T08:08:24  PID[8464] Information Header keys:
  Connection|Host|Max-Forwards|Conf-Organisation-Key|Ocp-Apim-Subscription-Key|
  X-Forwarded-For|X-LiveUpgrade|X-ARR-LOG-ID|DISGUISED-HOST|X-SITE-DEPLOYMENT-ID|
  X-Original-URL

所以没有客户端证书,也没有X-ARR-ClientCert标题。

更新 3:这是当我使用客户端身份验证证书直接访问我的实际 API 时产生的日志:

2015-12-07T09:16:45  PID[8464] Information Going to validate client certificate.
2015-12-07T09:16:45  PID[8464] Information Client cert: CN=rwildenberg@itq.nl
2015-12-07T09:16:45  PID[8464] Information Header keys:
  Connection|Accept|Accept-Encoding|Accept-Language|Cookie|Host|Max-Forwards|
  User-Agent|Upgrade-Insecure-Requests|DNT|X-LiveUpgrade|X-ARR-LOG-ID|DISGUISED-HOST|
  X-SITE-DEPLOYMENT-ID|X-Original-URL|X-Forwarded-For|X-ARR-SSL|X-ARR-ClientCert

直接来自请求的客户端证书和预期的X-ARR-ClientCert标头。

更新4:最后这恰好是我自己的错误(当然)。我确信后端的 urlhttps实际上是http. 客户端证书身份验证仅适用于 https,因此事后看来,在后端没有找到证书是完全合理的......

4

3 回答 3

4

您还需要为 Azure 托管 API 启用客户端证书身份验证 - 此步骤将确保 Azure 继承传入请求中的任何 X-ARR-ClientCert 标头。

否则,Azure 会在 X-ARR-ClientCert 标头到达您的 API 之前从 Request.Headers 中删除它。

注意:此设置仅适用于付费订阅

  1. 转到https://resources.azure.com/ 并选择所需的 azure 帐户
  2. 选择订阅 -> 资源组 -> your_resource_group -> 提供者 -> microsoft.web -> 站点 -> your_website
  3. 从顶部按钮进入读/写模式,进入编辑模式,然后在属性下设置属性“clientCertEnabled”:true。
"properties": {
    "name": "my-site",
    "state": "Running",
    "hostNames": [
      "my-site.azurewebsites.net",
      "(string)"
    ],
    ...
    "clientCertEnabled": true,
    ...
 }

文档:https ://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-configure-tls-mutual-auth

于 2017-05-31T20:40:58.673 回答
2

您真的要为 API 的所有用户管理客户端证书吗?我了解使用客户端证书来确保只有 APIM 可以直接与您的后端 API 对话。通常通过 API 管理公开 API 的开发人员使用 API 密钥来控制对 API 的访问。使用这种方法可以基于不同的配置“产品”应用策略。

如果您拥有管理证书创建和撤销的基础设施,那么这可能是正确的选择,这只是一种不常见的方法。话虽如此,我将研究 API 管理中可用的选项,以便能够在 APIM 网关上提取证书指纹。

于 2015-12-04T16:23:58.803 回答
1

I am contacting the engineers in APIM to figure out how this is intended to work and will get back to you. When you have APIM in front of your actual API (web app), my guess is that APIM is the proxy that will take care of all the authN / authZ for you. So requests would go to your API only when this succeeds. I am guessing that is why they probably just drop the client certificate instead of forwarding it onward. But I can definitely see why the client cert would still be useful in the web app.

于 2015-12-03T17:22:04.680 回答