我面临着通过他们的SSL证书authentication客户端的问题,这似乎与我在整个networking中发现的很多问题类似 – 不幸的是没有解决scheme。
安装程序是:Debian linux上的apache 2.2,mod_ssl,openssl。 我有一个客户端使用Globalsign PersonalSign证书进行身份validation。 我已经设置SSLCACertificatePath我觉得正确,因为Apachedebugging告诉我:
[Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA [Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2 [Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2 [Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
我不知道为什么两个证书都在这个列表中两次。 散列通过c_rehash实用程序正确链接。
现在客户端进行身份validation(我从debugging日志中复制我认为相关的条目):
Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA Certificate Verification: Error (20): unable to get local issuer certificate OpenSSL: Write: SSLv3 read client certificate B OpenSSL: Exit: error in SSLv3 read client certificate B Re-negotiation handshake failed: Not accepted by client!?
这对我有限的理解意味着他没有获得中间GlobalSign PersonalSign 1 CA-G2证书的签发者证书。 实际上,这个证书的issuer_hash与GlobalSign根CA的散列相匹配,SSLCACertificatePath中的SSLCACertificatePath正确地与这个非常散列相符,并且在日志中被加载的时候提到过。
所以我卡住了 任何想法的人?
编辑:
如果我通过openssl命令行实用程序validation用户的证书,它的工作原理是:
# openssl verify -CApath conf/ssl.user.crt/ test.pem test.pem: OK
( conf / ssl.user.crt是我的SSLCACertificatePath)
解决了它。 原来这是一个权限问题:
我在一台干净的Debian Squeeze机器上设置了一个类似的设置,它从一开始就工作正常。 debugging输出的差异是:
[debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 2, subject: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 0, subject: /[email protected]/[email protected], issuer: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2
在“好”方面,vs:
[debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA [error] [client 80.252.98.156] Certificate Verification: Error (20): unable to get local issuer certificate
在“坏”的一面。
这两个设置之间的主要区别在于CA-cert所在的apache安装的/ conf目录的权限。 出于安全原因,我们将权限设置为750,dir拥有root权限。 将CA文件移动到可读的目录(或者在path中使用准确的“可执行文件”)使问题消失。
所以看起来虽然mod_ssl声称在服务器启动时读取证书,但在运行时仍然需要访问散列文件(并且已经放弃了root权限)。