如何设置 IIS 以验证客户端证书并将其作为 http header 传递到后端?

How to setup IIS to verify a client certificate and pass it to the backend as an http header?

我看过很多关于 IIS 中的客户端证书身份验证的文章,但他们大多谈论的是客户端证书的 Required 模式。在这种情况下,身份验证完全在 Web 服务器端完成,如果证书丢失或无效,用户将被重定向到错误页面。我需要的是配置 IIS 以检查客户端证书是否存在,并将结果作为 http headers 传递到我的后端。使用 nginx 或 apache 网络服务器可以轻松完成。客户端认证可以设置为optional。然后,Web 服务器检查证书并将检查结果作为 SSL_CLIENT_CERT(证书的 PEM 表示)和 SSL_CLIENT_VERIFY(检查结果 - SUCCESS,NONE)传递。 ..) headers 到应用程序后端。因此,在后端部分,我可以读取 headers 并使用这些值进行实际身份验证——在数据库中查找用户,颁发身份验证令牌。在 IIS 中可以吗?如果是,是否有任何关于如何绕过证书和检查状态为 http headers?

的文档

过了一会儿,我正在写我的问题的答案。

必须使用 ARR 扩展设置 IIS 才能充当反向代理。然后,可以为默认网站启用客户端证书身份验证。以下是几个指向如何实现它的说明的链接:

以及一些指向 SSL/TLS 握手和一般证书的非常可靠解释的链接:

基本上,应该为 IIS 启用应用程序请求路由 (ARR) 扩展以充当代理。然后,您设置代理旁路路由。接下来,您需要为 IIS 服务器设置一个有效的服务器证书,并在默认网站 https 绑定中使用它。该证书应由 CA 颁发,该证书应放入本地计算机的受信任的根证书颁发机构和中间证书颁发机构。然后,您应该在默认网站的 SSL 设置中要求 SSL,客户端证书设置等于接受。在这种情况下,任何连接到 Web 服务器的客户端都将被要求提供由与服务器证书相同的 CA 颁发的有效客户端证书。

实际上,IIS 将 Web 服务器信任的根颁发者的可分辨名称列表发送到客户端浏览器。浏览器找到此名称与客户端信任的证书颁发者的交集,并在交集中查找由颁发者颁发的有效证书。之后,用户选择其中之一(或 none),然后根据 CA 证书检查所选证书。如果证书通过检查,则请求 "redirected" 到后端应用程序,证书在 X-ARR-ClientCert header 中。 header 的名称可以在 Server -> Configuration Editor -> system.webServer/proxy -> clientCertHeaderName IIS 参数中更改。如果用户选择(或拥有)none 个所需证书,则请求 "redirected" 到没有 header 的应用程序后端。

看来,根本不需要在SSL_CLIENT_VERIFYheaderwith状态下检查。如果证书有效,则在 header 中传递。如果证书丢失,header 为空。如果证书由客户端提供但无效,则请求失败并且根本不是 "redirected" 到后端应用程序服务器。似乎,这是一种罕见的情况,但我有一个例子。

想象一下,服务器证书是由具有专有名称 XXX 的 CA 颁发的,并且有一个由 CA 颁发的客户端证书 YYY(在客户端计算机上)具有专有名称 XXX 但这些 CA 不相同(其中一个或两个都是 self-signed)。在这种情况下,YYY 证书出现在浏览器显示的证书选择对话框中,但该证书未通过针对真实 Web 服务器 CA 的进一步验证。

就是这样。此外,IIS 似乎无法要求(或接受)某些应用端点(地址)的客户端证书。除了为整个网站启用外,我还没有找到任何其他选项。

IIS ARR 也可以配置后端或上游服务器的客户端证书。在这种情况下,连接到此 IIS 的用户无需提供证书,因为它会由 IIS 自动附加。

此配置仅适用于 IIS 服务器级别。