我怎样才能使apache申请一个客户端的SSL证书,而不需要validation它与一个已知的CA?

我正在使用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_VERIFYvariables,如果你的手动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文档。)