vB·流水账

生命在于折腾。

配置Apache服务器双向证书认证

2014-12-21 vibbow

这玩意需要的人应该比较少,不过既然折腾出来了,就发篇文章记录一下吧。

1. 按照这里的配置文件,正确的配置Apache服务器的SSL证书
https://mozilla.github.io/server-side-tls/ssl-config-generator/

(IIS服务器可以用这个: https://www.nartac.com/Products/IISCrypto/


2. 在网站Apache配置文件的VirtualHost内,添加如下内容:

SSLCACertificatePath /etc/ssl/certs
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +StdEnvVars


3. 保存配置文件,重启Apache,访问你的网站,这时候就会提示选择一个数字证书(或者提示安全协商失败,如果你电脑里没有任何可用的证书的话)
01.png


4. 以上配置都是假设你客户端的证书是由可信的证书颁发机构颁发的,如果你的客户端证书不是由可信的证书颁发机构颁发的,那么依然会被服务器拒绝。你可以按照这篇文章的教程来将你自己生成的CA证书添加到系统证书列表里: http://wiki.cacert.org/ApacheServerClientCertificateAuthentication

如果你看不懂英文,没关系,简单来说就是这样:
1. 把你的证书扔到服务器的一个地方
2. 用openssl来计算出你证书的hash值: openssl x509 -noout -hash < YOURCA.crt
3. 上一步会返回一个类似 12ab34cd 的结果,记下这个数字
4. 进入 /etc/ssl/certs 目录,使用以下命令创建一个到CA证书的软链接
ln -s /path/of/your/ca.cert 12ab34cd.0
这里的 /path/of/your/ca.cert 就是你CA证书的路径,12abcd34就是你在第二步得到的结果。请注意,文件名后面还有个 .0 [点零],这个千万不要忘了。
5. 重启一下Apache,再试着用你自己生成的证书验证一下,应该就OK了~


在PHP里查看客户端证书信息:
当你使用了客户端证书进行双向认证时,相应的客户端证书信息也可以通过$_SERVER变量来获取,$_SERVER里以 SSL_CLIENT_ 开头的值均为客户端证书的信息。


使用硬件数字证书:
你也可以使用硬件设备来保存你的数字证书,比如说智能卡或者USB智能卡(银行的U盾就是这玩意)
我个人使用的是 飞天诚信的 ePass3003Auto,完美支持 IE / Firefox / Chrome
具体产品信息见这里: http://www.ftsafe.com.cn/products/epass/ePass3000set/ePass3003Auto

发表评论: