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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设置IIS以验证客户端证书并将其作为http标头传递给后端?相关的知识,希望对你有一定的参考价值。

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

答案

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

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

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

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

实际上,IIS会将Web服务器信任的根颁发者的可分辨名称列表发送到客户端浏览器。浏览器找到这些名称与客户端可信证书颁发者的交集,并查找交叉发布者发布的有效证书。之后,用户选择其中一个(或无),并根据CA证书检查所选证书。如果证书通过检查,则请求被“重定向”到后端应用程序,并且证书位于X-ARR-ClientCert标头中。可以在服务器 - >配置编辑器 - > system.webServer / proxy - > clientCertHeaderName IIS参数中更改标题的名称。如果用户选择(或没有)所需的证书,则将请求“重定向”到没有标题的应用后端。

似乎,SSL_CLIENT_VERIFY标题中根本没有需要检查状态。如果证书有效,则在标题中传递。如果缺少证书,则标头为空。如果证书由客户端提供但无效,则请求失败,并且根本不会“重定向”到后端应用服务器。似乎,这是一个罕见的情况,但我有一个例子。

想象一下,服务器证书由具有可分辨名称XXX的CA颁发,并且有一个客户端证书YYY(在客户端计算机上)由具有可分辨名称XXX的CA颁发但是那些CA不相同(一个或者他们都是自签名的)。在这种情况下,YYY证书存在于浏览器显示的证书选择对话框中,但证书未通过针对真实Web服务器CA的进一步验证。

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

以上是关于如何设置IIS以验证客户端证书并将其作为http标头传递给后端?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 客户端证书身份验证,服务“SslRequireCert”的 SSL 设置与 IIS“Ssl,SslNegotiateCert”的设置不匹配

“此服务的安全设置需要 Windows 身份验证”客户端证书 WCF 项目的 IIS 错误

HTTP 错误 403.16 - 客户端证书信任问题

客户端身份验证方案“匿名”禁止 HTTP 请求

在 IIS 上将客户端证书选项设置为“已接受”时未调用 CustomCertificateValidator

在IIS下部署SSL证书实现HTTPS