Isa*_*aac 9 ssl certificate ssl-certificate apache-2.2
我正在使用 apache2 (2.2.3) 来为我希望客户端使用证书进行身份验证的站点提供服务。由于我只需要验证提供特定证书的用户是否与过去提供该证书的用户相同,因此签署证书的 CA 无关紧要。不过,似乎使用SSLVerifyClient require
需要SSLCACertificateFile ...
(或SSLCACertificatePath ...
),然后 apache 将只接受由该文件/路径中的 CA 签名的证书。有没有办法让 apache 接受任何客户端证书,而不管颁发/唱歌的 CA 是什么?(即验证客户端是否具有与所提供公钥对应的私钥,但不必费心验证颁发/签名 CA)
Bru*_*uno 11
正如您所发现的,您可以在 Apache Httpd 中的 SSL/TLS 握手级别使用SSLVerifyCLient optional_no_ca
.
您将要面对的第二个问题是让客户端发送证书。由于您的证书不打算在 PKI 中,因此它们可以是自签名的并且具有不同的颁发者。
请求客户端证书时,服务器会在握手期间向客户端发送CertificateRequest
TLS 消息。此消息包含certificate_authorities
列表:
可接受的证书颁发机构的专有名称列表。这些专有名称可以为根 CA 或从属 CA 指定所需的专有名称;因此,该消息可用于描述已知根和所需的授权空间。如果certificate_authorities 列表为空,则客户端可以发送任何适当ClientCertificateType 的证书,除非有一些相反的外部安排。
浏览器使用它来选择要发送的客户端证书(如果有)。
(请注意,有关空列表的部分仅在 TLS 1.1 以后的规范中。SSL 3.0 和 TLS 1.0 对此保持沉默,在实践中,它也将起作用。)
为此,您有两个选择。
如果您期望的客户端证书将是自签名的,则它们都有不同的颁发者。因为您不知道会发生什么,服务器将需要发送一个空列表。为此,请使用该SSLCADNRequestFile
指令并将其指向仅包含一个空行的文件(如果我没记错的话,它不适用于完全空的文件)。
第二个(不太干净)选项。是就您期望的所有客户端证书通用的颁发者 DN 达成一致,无论它们是否确实由该 CA 证书颁发(或者该 CA 是否存在)。通过这样做,您将大大(更多)破坏 PKI 模型。
如果您同意发行人 DN CN=Dummy CA
(例如)。任何人都可以使用CN=Dummy CA
主题 DN(和颁发者 DN)构建自签名证书,可能使用不同的密钥。尽管该SSLCADNRequestFile
指令期望配置证书以构建列表,但这些根本不用于验证客户端证书,这只是配置certificate_authorities
列表的一种复杂(但在其他指令的上下文中很自然)方式。如果您作为服务将带有这些名称的自签名证书放入 中SSLCADNRequestFile
,这将使CertificateRequest
TLS 消息CN=Dummy CA
在certificate_authorities
列表中使用(这些只是名称,在此阶段不是证书)。然后,客户端将能够使用颁发者 DN 获取自己的证书CN=Dummy CA
,无论其签名是否可以通过该证书(相同的密钥)进行验证,因为无论如何这些步骤都不涉及签名验证。
话虽如此,请记住SSLVerifyCLient optional_no_ca
,没有进行真正的证书验证(我想您可以检查SSL_CLIENT_VERIFY
变量,如果您的手动验证只是您无论如何配置的 PKI 的后备解决方案)。在那个阶段你所知道的就是客户端拥有它提供的公钥证书的私钥(由 TLSCertificateVerify
消息保证):如果你想对某些人进行身份验证,你将需要执行某种形式的验证种类。(您不能信任证书的任何内容,即其公钥与其包含的名称/属性之间的任何绑定。)
这不适用于文件,但您可以为应用程序执行此操作(例如 PHP/CGI/... 甚至 Java,如果您将证书传递给代理的 Java 服务器)。一种基本方法是拥有一个预先知道的公钥列表,或者您可以查看FOAF+SSL/WebID中的想法。
归档时间: |
|
查看次数: |
28948 次 |
最近记录: |