一、https分为单向认证和双向认证:
单向认证就是说,只有客户端使用ssl时对服务器端的证书进行认证,也就是说,客户端在请求建立之前,服务器端会向客户端发送一个证书,一般情况下,这种证书都是由自己或企业自行发布的,所以在客户端使用https时,会跳出“是否信任并继续”,点击信任则表示客户端信任服务器端证书,才可以继续交互。
双向认证,就是服务器端和客户端都对双方的证书进行认证,这时除了单向认证外,还需要在服务器端的受信任证书列表中加入客户端的证书,这样服务器端才能信任客户端的请求。
二、配置:
1.单向认证配置:
(1)首先使用keytool生成服务端密钥仓库,命令: keytool -genkey -keyalg RSA -alias tomcatsso -dname "CN=localhost" -keystore d: omcatsso.keystore -storepass changeit
命令参数-genkey表示是要生成新的密钥库,keyalg表示使用的密钥生成算法是RSA,alias表示别名,keystore表示生成的密钥库存储在什么地方,文件格式可以自定义,-storepass是表示密钥库的密码。
该步骤生成了一个密钥库,该密钥库包含私钥和公钥等文件。把它用于服务器端的证书库,用于客户端浏览器认证服务端。
(2)开启tomcat对ssl的支持,具体方法是去掉 <Connector port="8443"...>这一段的注释,并在本段的末尾加上keystoreFile="d: omcatsso.keystore" keystorePass="changeit"这两个属性,这两个属性会告诉tomcat去哪儿寻找服务器端密钥库。重启tomcat,至此tomcat对https的修改完成。
(3) 客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览的“受信任的根证书颁发机构”。由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的.cer或.crt文件,使用如下命令:
keytool -keystore d: omcatsso.keystore -export -alias tomcat -file D:home omcat.cer
然后双击D:home omcat.cer文件,选择安装到“受信任的根证书颁发机构”下面。
如果没有第三步,浏览器会跳出“是否信任并继续”,点击信任则表示客户端信任服务器端证书,才可以继续交互。消除该项请使用OPenSSL申请一个正式的服务器证书,参考http://blog.csdn.net/jasonhwang/article/details/2344768
2.双向认证配置:
(1) 为客户端(即IE或firefox)生成证书库,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书库格式应该是PKCS12,即生成证书的时候storetype是PKCS12。因此,使用如下命令生成:
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:homeclient.keys
客户端的CN可以是任意值。
(2)在客户端安装证书库。注意:不能导入.cer或者.crt格式文件,因为它会把这些文件当做服务端的认证文件,单向认证自动安装。
打开IE->工具->内容->证书->个人->导入->选择任意文件 D:homeclient.keys ->输入密钥。一定要存在个人区。可以参考《http://www.linuxyw.com/a/WEBfuwu/20130530/516.html》
(3)让服务端信任客户端证书,由于不能直接将PKCS12格式的证书库导入,必须先把服务器证书导出为一个单独的.cer或.crt文件,
导出的客户端证书导入服务端受信任的证书库,该命令表示服务器端信任该证书,命令:keytool -import -alias tomcatsso -file D:homeclient.cer -keystore D:homeclient.trustkeys ,不必先建client.trustkeys库;
或者导入默认的服务器端信任证书库,命令:keytool -import -alias tomcatsso -file D:homeclient.cer -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit
这里的java_home是tomcat使用的jdk的位置,"%java_home%/jre/lib/security/cacerts"的 cacerts是个无后缀文件,表示服务器认证客户端时使用的根证书库。
参考文章:《keytool命令使用实例》 http://www.360doc.com/content/10/0121/10/633992_14065815.shtml
《使用key配置https》 http://www.blogjava.net/stevenjohn/archive/2012/08/22/385989.html