我想让我的用户能够使用他们自己的x.509证书登录。用户提供我(帐户注册脚本)他/她的x.509公钥。Apache应该只接受已知的公钥(在类似于.htpasswd的文件中指定)并拒绝其他公钥。我必须如何配置apache才能实现这一点?
我尝试过google,但只找到了CA签名的x.509证书的解决方案。CA对于这个问题是没有意义的。即使是自签名的x.509,如果它的公钥是已知的,也应该能够登录。
发布于 2012-03-11 16:59:57
您可以使用所有客户证明文件制作CA文件,这应该是可行的。
但是,您将不再能够信任证书CN来验证不同的用户。
如果您不想重新启动Apache,那么仍然可以使用CA目录而不是CA包,使用SSLCACertificatePath指令(您需要对证书进行符号链接或重命名,以便通过散列访问它们)。
发布于 2012-03-11 18:18:43
您可以这样做,Apache中没有任何用于正常身份验证的内容。您将需要应用程序中的一些代码来处理这个问题(即在PHP/CGI/Java层中执行身份验证):这或多或少地排除了普通文件(HTML、JS、.)不幸的是。
为了这样做,
SSLVerifyClient optional_no_ca允许接受任何证书(就Apache的SSL/TLS层而言);SSLCADNRequestFile指向一个只有一个空行的文件:这将使CertificateRequest发送一个空的certificate_authorities列表,这将向客户机表明它可以发送任何东西(而不是它保证服务器将接受它)。TLS 1.1明确允许这种行为(以前的版本对此主题保持沉默)。实际上,它适用于大多数浏览器中的SSLv3和TLS1.0。这将允许在SSL/TLS握手过程中显示和接受任何证书。不幸的是,这也删除了Apache Httpd所做的任何身份验证,因此验证CNs或证书其他部分的指令都没有任何用处(因为您不能信任证书的内容)。
在此阶段,您所知道的是,客户端在所提供的证书中拥有公钥的私钥(否则CertificateVerify TLS步骤将失败)。你甚至不能相信证书的主题。此证书将在SSL_CLIENT_CERT中。在将其与已知的公钥列表进行比较之前,您必须有一些代码来读取它并提取它的公钥。(例如,如果您通过mod_proxy将此客户端证书传递给后端Java服务器,这也是可行的。)PHP、Perl、Python、Java (选择您喜欢的语言)中有一些库来分析证书的内容,但是它需要一些编程,当然只会验证由这样一个应用程序处理的请求。
https://serverfault.com/questions/368555
复制相似问题