代码之家  ›  专栏  ›  技术社区  ›  Troels Thomsen

使用IIS 6上ASP.NET MVC站点的客户端证书

  •  4
  • Troels Thomsen  · 技术社区  · 16 年前

    想要通过客户端证书实现身份验证,我遇到了一些问题。

    首先是一些事实

    整个站点都在使用SSL。我正在使用IIS 6(在Windows Server 2003上),并且已将该站点配置为接受客户端证书,而不需要这些证书。然而,大多数浏览器都是以某种方式实现的,因此它们只会在严格要求证书时向用户请求证书。因此,身份验证模型并不真正有用。

    我自己的建议

    我的第一个想法是 HttpResponse.Status 但它要求第一个空格之前的字符为整数。让浏览器发送客户端证书的有用状态是 403.7 Client certificate required 所以这将不起作用(除非您可以覆盖它)。

    我还认为我只需要将IIS配置为需要特定路径的客户端证书,但这(当然)只适用于物理文件,而不适用于路由。

    一个可能的解决方案是创建一个特定的文件夹,并需要客户端证书,这比解决方案更像是一个黑客。所以如果有人有更好的建议,我想避免这种情况。

    澄清

    我已经测试了Internet Explorer、Firefox和Chrome的浏览器响应(我使用Chrome作为我的主浏览器,使用Firefox作为辅助浏览器)。除非我在IIS中根据需要配置客户端证书,否则没有任何浏览器要求该证书。

    HTTP状态代码403.7是根据我的理解允许的,因为RFC2616只将状态代码定义为前三位数字。当需要客户端证书时,由于IIS6返回403.7,我认为发送它将强制IIS进入特殊模式,从而触发一个需求。

    我想现在的问题是如何配置IIS,使其在给定虚拟路径而不是物理路径的情况下需要证书。

    1 回复  |  直到 16 年前
        1
  •  3
  •   erickson    16 年前

    当证书只是被请求而不是被要求时,服务器发送的certificateRequest消息没有区别。在这两种情况下,服务器都会发出相同的请求,当客户端无法提供所需的证书时,服务器只会终止握手。因此,如果您的浏览器似乎忽略了“请求”,那么它也应该忽略“需求”。

    检查以下内容:

    • 您的浏览器是否配置为忽略 所有证书请求,从不 发送一个?
    • 您的浏览器是否配置为使用 没有提示的证书 用户?(换句话说,您如何知道浏览器没有发送证书?)
    • 您的服务器是否正在请求 证书?

    我测试最后一个案例的方法是 OpenSSL (也可在 Cygwin 工具:

    openssl s_client -connect server.y.com:443 -msg
    

    在服务器发送其证书消息后,它将插入一个certificateRequest方法,如果它不请求客户端身份验证,则该方法不存在。S_客户机输出如下:

    <<< TLS 1.0 Handshake [length 0008], CertificateRequest
        0d 00 00 04 01 01 00 00
    

    如果服务器只在特定路径上使用客户端身份验证,我不确定它是如何工作的,因为在客户端传输HTTP请求之前,初始的SSL握手已经完成。此时服务器请求新的握手是合理的,但我从未测试过哪些服务器支持这种方式。

    您可以手动通过S_客户端伪造HTTP请求,输入:

    GET /your/path/here HTTP/1.1[Enter]
    Host: server.y.com:443[Enter]
    [Enter]
    

    如果您根本看不到证书请求消息,则说明您的服务器设置不正确。

    基于目录结构指定安全约束是非常常见的,实际上可以很好地简化安全管理。如果这为你提供了解决方案,不要为此感到难过。

    403.7不是HTTP状态代码。这是微软“拥抱、扩展和消灭”的诡计吗?在任何情况下,这听起来都不像是正确的方向,因为这是一个传输层问题,而不是应用层问题。