生产环境中为加强安全一般采用SSL通讯,实践中为了保证客户端身份,也可以使用客户端证书,如果客户端没有安装证书,给出相应的指引。本文给出的是如何在Tomcat或者Apache中配置可选的客户端证书验证。
在Apache + mod_jk + Tomcat的部署架构下,需要把SSL相关配置放在Apache的配置文件中,配置文件一般如下:
SSLEngine on SSLProtocol all -SSLv2 SSLCertificateFile /data/web/keys/your.crt #证书颁发机构颁给的证书文件如StartSSL的免费证书 SSLCertificateKeyFile /data/web/keys/decrypted.key #解密后的私钥 SSLCertificateChainFile /data/web/keys/ca.crt #证书颁发机构的中间证书链 SSLVerifyClient none SSLCACertificateFile /data/web/keys/your_trust_ca.crt #你自己的CA,由这个CA签发的客户端证书会被服务器认可。不需要购买或者证书提供商的证书。 DocumentRoot /var/www/dummy ServerName myserver.cn ServerAlias www.myserver.cn ErrorLog "logs/ssl_error_log" CustomLog "logs/ssl_access_log" common JkMount /* worker1 #预先定义好的worker #经测试Location方式指定只对指定页面要求客户端验证的设置不被IE8支持,放弃 #SSLVerifyClient optional表示即使没有客户端证书也允许打开页面,需要有应用来限制没有证书的处理方式。 # SSLVerifyClient optional SSLVerifyDepth 1 #
另外需要在Apache配置文件中加上
SSLOptions +StdEnvVars +ExportCertData
以便Apache可以把证书传递给Tomcat。
另一种情况,部署架构只有Tomcat的话,配置文件需要注意的部分如下:
自建客户端证书如果由中间CA签发,在Tomcat中没有问题,Apache上述配置仍然认证失败,原因待研究。如果不存在中间证书,直接由自建CA根证书签发的客户端证书则没有问题。
原来是SSLVerifyDepth设为1导致的只识别一层证书,进而认证失败。
只需设置SSLVerifyDepth 3即可识别3层证书结构,以此类推。