4

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

首先一些事实

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

我自己的建议

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

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

一种可能的解决方案是创建一个特定的文件夹并要求为其提供客户端证书,这更像是一种黑客攻击而不是一种解决方案。因此,如果有人有更好的建议,我想避免这种情况。

澄清

我测试了 Internet Explorer、Firefox 和 Chrome 的浏览器响应(我使用 Chrome 作为主要浏览器,使用 Firefox 作为辅助浏览器)。除非我在 IIS 中根据需要进行配置,否则所有浏览器都不会要求提供客户端证书。

由于我的理解允许 HTTP 状态代码 403.7,因为 RFC 2616 仅将状态代码定义为前三位数字。由于 IIS 6 在需要客户端证书时返回 403.7,我认为发送它会强制 IIS 进入触发要求的特殊模式。

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

4

1 回答 1

3

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

检查以下内容:

  • 您的浏览器是否配置为忽略所有证书请求,从不发送?
  • 您的浏览器是否配置为使用给定证书而不提示用户?(换句话说,你怎么知道浏览器没有发送证书?)
  • 您的服务器实际上是否在请求证书?

我测试最后一种情况的方法是使用OpenSSL(也可在Cygwin中使用)工具:

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

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

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

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

您可以通过 s_client 手动伪造 HTTP 请求,输入:

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

如果您根本没有看到 CertificateRequest 消息,则说明您的服务器设置不正确。

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

403.7 不是 HTTP 状态码。这是微软“拥抱、扩展和消灭”的诡计吗?无论如何,这听起来不像是正确的方向,因为这是传输层问题,而不是应用层问题。

于 2008-09-23T18:16:26.807 回答