我正在使用apache2(2.2.3)服务的网站,我希望有客户端证书进行身份validation。 由于我只需要validation提交特定证书的用户是否是过去提供过该证书的同一个用户,那么签署证书的CA就无关紧要了。 似乎使用SSLVerifyClient require
需要SSLCACertificateFile ...
(或SSLCACertificatePath ...
),然后apache将只接受由该文件/path中的CA签名的证书。 有没有办法让apache接受任何客户端证书,无论发行/唱歌CA? (即,validation客户端是否具有相应的提供公钥的私钥,但不打扰validation签发/签署CA)
如您SSLVerifyCLient optional_no_ca
,您可以使用SSLVerifyCLient optional_no_ca
在Apache SSLVerifyCLient optional_no_ca
中的SSL / TLS握手级别禁用证书validation。
您要面对的第二个问题是要让客户端发送证书。 由于您的证书不打算在PKI内,所以它们可以是自签名的,并且有不同的发行者。
当请求一个客户端证书时,服务器在handhsake期间发送一个CertificateRequest
TLS消息给客户端。 此消息包含certificate_authorities
列表:
可接受的证书颁发机构的可分辨名称的列表。 这些专有名称可以为根CA或从属CA指定所需的可分辨名称; 因此,这个消息可以用来描述已知的根和期望的授权空间。 如果certificate_authorities列表为空,则客户端可以发送任何适当ClientCertificateType的证书,除非有相反的外部安排。
浏览器使用它来select要发送的客户端证书(如果有的话)。
(请注意,关于空列表的部分只是在TLS 1.1以上的规范中,SSL 3.0和TLS 1.0对此没有提到,实际上也是可行的。)
你有两个select。
如果您期望的客户证书将会自行签署,那么他们将拥有不同的发行人。 因为你不知道会发生什么,服务器将需要发送一个空的列表。 要做到这一点,使用SSLCADNRequestFile
指令,并将其指向一个文件,只包含一个空行(如果我记得很好,它不适用于一个完全空的文件)。
第二个(不太干净)选项。 是否同意您所期望的所有客户端证书通用的颁发者DN,无论它们是否确实由该CA证书颁发(或者该CA是否存在)。 通过这样做,你将会大大地打破PKI模式(更多)。
如果您同意CN=Dummy CA
(例如)的颁发者DN。 任何人都可以使用CN=Dummy CA
作为主题DN(和颁发者DN)构build自签名证书,可能使用不同的密钥。 尽pipeSSLCADNRequestFile
指令期望使用证书进行configuration来构build列表,但这些指令根本不用于validation客户端证书,它只是configurationcertificate_authorities
列表的复杂(但在其他指令的上下文中是很自然的)方式。 如果您作为服务在SSLCADNRequestFile
放入了一个自签名的证书,这将使CertificateRequest
SSLCADNRequestFile
TLS消息在certificate_authorities
列表中使用CN=Dummy CA
(这些只是名称,而不是此阶段的证书)。 然后,客户端将能够使用颁发者DN CN=Dummy CA
来获取自己的证书,无论其签名是否可以由该证书(相同的密钥)validation,因为无论如何都不涉及签名validation。
这SSLVerifyCLient optional_no_ca
,记住用SSLVerifyCLient optional_no_ca
,没有真正的证书validation(我想你可以检查SSL_CLIENT_VERIFY
variables,如果你的手动validation只是一个你已经configuration的PKI的后备解决scheme)。 你所知道的那个阶段是,客户端拥有它所提供的公钥证书的私钥(由TLS CertificateVerify
消息保证):如果你想要进行身份validation,你将需要执行某种forms的validation某种。 (您不能相信证书的任何内容,也就是其公钥与其所包含的名称/属性之间的任何绑定。)
这对于文件来说效果不好,但是你可以为应用程序(例如PHP / CGI / …甚至是Java,如果你把证书传给代理Java服务器的话)这样做。 一个基本的方法是有一个预先知道的公钥列表,或者你可以看看FOAF + SSL / WebID的想法。
使用SSLVerifyCLient optional_no_ca
(而不是require
)会导致apache不检查颁发CA(因此不需要CA证书文件或path)。 它确实允许客户/用户不提交证书,因此检查完全使用证书必须单独完成。
(显然,我只是没有彻底阅读mod_ssl
文档。)