一、SSL简单介绍
SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改。
怎样保障数据传输安全?
客户端和服务器端在进行握手(客户端和服务器建立连接和交换参数的过程称之为握手)时会产生一个“对话密钥”(session key),用来加密接下来的数据传输,解密时也是用的这个“对话密钥”,而这个“对话密钥”只有客户端和服务器端知道。也就是说只要这个“对话密钥”不被破解,就能保证安全。
2. 客户端证书和服务器端证书
客户端证书和服务器端证书用于证明自己的身份,就好比每个人都有一张身份证,这种身份证是唯一的。一般来说,只要有服务器端的证书就可以了,但是有时需要客户端提供自己的证书,已证明其身份。
二、生成自签名的服务器端证书和导入服务器端信任证书库一般证书可以使用权威机构颁发的证书,如:veri sign,百度使用的就是veri sign颁发的证书,这样的权威证书机构是受信任的,但是这些机构颁发的证书往往是需要收费的,这样的证书也难得到。对于小型企业来说为了节约成本,常常使用自签名的证书。
接下来使用JDK keytool工具来签发证书,如果未安装JDK,请先安装JDK(本文使用的是JDK7)。本文所有的证书文件都放到F:\ca,您可以选择一个目录来存放。
生成服务器端证书
keytool -genkeypair -v -alias server -keyalg RSA -validity 3650 -keystore ./server.keystore -storepass 123456 -keypass 123456 -dname "CN=127.0.0.1,OU=rm,O=rm,L=gz,ST=gd,C=cn"
注意:-dname参数中的CN应该为服务器所在的ip或者域名
2. 导出服务器端证书
keytool -exportcert -alias server -keystore ./server.keystore -file ./server.cer -storepass 123456
3. 将服务器端证书导入信任证书
keytool -importcert -alias serverca -keystore ./server_trust.keystore -file ./server.cer -storepass 123456
三、生成客户端证书并导入到服务器端信任证书库生成客户端证书
keytool -genkeypair -v -alias client -dname "CN=rorymo" -keyalg RSA -validity 3650 -keypass 123456 -keystore ./client.p12 -storepass 123456 -storetype PKCS12
2. 导出客户端证书
keytool -exportcert -alias client -file ./client.cer -keystore ./client.p12 -storepass 123456 -storetype PKCS12
3. 导入客户端证书到服务器端信任证书库
keytool -importcert -alias clientca -keystore ./server_trust.keystore -file ./client.cer -storepass 123456
4. 查看服务器端信任证书库的信任证书信息
keytool -list -keystore ./server_trust.keystore -storepass 123456
可以看到信任证书库中已经导入了一张服务器端证书和一张客户端证书
5. 至此我们已经生成了如下的文件
四、配置tomcat和web应用将证书文件放到tomcat根目录下
将上图的server.keystore和server_trust.keystore放到tomcat的根目录下,例如我的tomcat目录为:F:\ca\apache-tomcat-7.0.64
2. 配置tomcat
编辑conf/server.xml文件加入如下的配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="${catalina.base}/server.keystore" keystorePass="123456" truststoreFile ="${catalina.base}/server_trust.keystore" truststorePass="123456"/>
说明:
clientAuth为true表示开启SSL双向认证
keystoreFile指定服务器端的证书位置
truststoreFile指定服务器端信任证书库
3. 编写用来获取客户端证书的servlet