2017-10-09 36 views
0

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

回答

0

过了一段时间,我正在为我的问题写一个答案。

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

和几个环节的SSL/TLS握手的非常坚实的解释和证书一般:

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

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

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

试想,一个服务器证书是由CA颁发了专有名称XXX,并且存在由CA与辨别名称XXX颁发的客户端证书YYY(客户端计算机上),但这些CA是不相同(其中一个或两个都是自签名的)。在这种情况下,YYY证书出现在浏览器显示的证书选择对话框中,但证书不会针对真实Web服务器CA传递进一步的验证。

就是这样。此外,似乎IIS没有办法仅为某些应用程序端点(地址)要求(或接受)客户端证书。除了启用整个网站之外,我还没有发现任何其他选择。