第一部分,先说证书的申请。java
这步是要到正规的CA公司申请正式的设备证书必须走的步骤。apache
一、先生成证书的密钥对浏览器
打开命令行,切换到某个本身新建的目录下,执行以下命令tomcat
keytool -genkey -keyalg RSA -keysize 1024 -dname “CN=www.javastar.org,OU=翊天阁,O=翊天阁,L=南京市,ST=江苏省,C=CN” -alias server -keypass 123456 -keystore server.jks -storepass 123456 -validity 365服务器
这里说明一下几个重要的地方,CN=www.javastar.org,这里的www.javastar.org必定要换成你实际要部署的站点的域名,若是是在内网,就要用服务器的hostname,必定不能够用IP,不然,是没法创建SSL连接的。spa
OU=翊天阁,O=翊天阁,这里能够替换成你本身的组织名称,或者公司名称。.net
-validity 365这里声明证书有效期为1年。命令行
其余的参数本身能够参考keytool的使用帮助或相关文档。server
好了,成功执行上面的命令后,咱们在当前命令行所在目录获得server.jks文件,这个就是包含密钥对的基本证书信息库文件。xml
二、导出证书请求文件
keytool -certreq -alias server -sigalg “SHA1withRSA” -file server.pem -keypass 123456 -keystore server.jks -storepass 123456
这里能够获得一个server.pem的文件。
三、向CA公司申请签发设备证书
将上一步获得的server.pem证书发送给相关的CA公司,CA公司会经过这个申请签发一张设备证书,最后咱们会获得一个.cer的文件,好比server.cer。
同时,咱们要取得该CA公司的证书链,好比会有CA_ROOT.cer和CA_CA.cer,第一张为CA公司的根证书,第二张为CA公司的签名证书。
四、将CA根证书导入服务器证书库
keytool -import -alias CA_ROOT -keystore server.jks -trustcacerts -storepass 123456 -file CA_ROOT.cer
五、将CA签名证书导入服务器证书库
keytool -import -alias CA_CA -keystore server.jks -trustcacerts -storepass 123456 -file CA_CA.cer
六、使用CA签发的证书回复咱们本身生成的包含私钥的证书
keytool -import -alias server -keystore server.jks -trustcacerts -storepass 123456 -file server.cer
七、导出回复成功后的服务器证书
keytool -export -alias server -storepass 123456 -file javastar.org.cer -keystore server.jks
好了,到这里咱们须要的设备证书已经ok了。
最后对咱们实际有用的是两个文件:server.jks,是服务器证书库,存储了含有私钥的服务器证书,及其证书链,这个就是主要的设备证书了,是放在服务器的SSL配置里面;还有一个是javastar.org.cer,这个是只包含服务器证书公钥的设备证书,是发给用户,让用户放入本身的可信任库的。
第二部分,配置Tomcat的SSL双向连接
一、准备客户端证书
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname “CN=Client,OU=javastar.org,L=nj,ST=js,C=cn” -storepass 123456 -keypass 123456 -validity 365
执行完毕,咱们会获得一张p12的客户证书client.p12。
二、导出.cer格式的客户证书
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
执行完毕获得client.cer证书。
三、将客户端证书导入服务器的可信任证书库
keytool -import -v -file client.cer -keystore servertrust.keystore -storepass 123456
执行完毕获得servertrust.keystore,这个是给tomcat服务器端用的。
四、将服务器证书导入客户端可信任证书库
keytool -import -v -file javastar.org.cer -keystore clienttrust.keystore -storepass 123456
执行完毕会获得clienttrust.keystore证书库,留着备用。同时,也能够一样的方法,把CA_ROOT.cer和CA_CA.cer导入。
五、在和tomcat的bin目录并行的目录下新建一个cert文件夹,把server.jks和servertrust.keystore文件拷贝进去。
六、找到tomcat的server.xml文件,找到以下的内容
<!–
<Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
maxThreads=”150″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS” />
–>
去掉注释,并修改成
<Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
maxThreads=”500″ scheme=”https” secure=”true”
clientAuth=”true” sslProtocol=”TLS”
keystoreFile=”D:/apache-tomcat-6.0.20/cert/server.jks” keystorePass=”123456″
truststoreFile=”D:/apache-tomcat-6.0.20/cert/servertrust.keystore” truststorePass=”123456″/>
这里注意把D:/apache-tomcat-6.0.20/cert修改成你的tomcat实际的路径。
七、启动或者重启tomcat,在浏览器中导入client.p12的证书,而后,在地址栏输入https://www.javastar.org:8443,就会弹出证书选择框,选择证书后,就能够使用SSL协议访问tomcat服务器了。
第三部分,在程序中如何创建与服务器的SSL双向认证连接
其实这个就简单了,以java为例,好比咱们如今要访问一个经过SSL双向认证保护的WebService接口,只须要在生成的客户端程序中开始部分加入
System.setProperty(“javax.net.ssl.keyStore”, “D:/client.p12″);
System.setProperty(“javax.net.ssl.keyStorePassword”, “123456″);
System.setProperty(“javax.net.ssl.keyStoreType”, “PKCS12″);
System.setProperty(“javax.net.ssl.trustStore”, “D:/clienttrust.keystore”);
System.setProperty(“javax.net.ssl.trustStorePassword”, “123456″);
System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
JVM会自动将证书提交给服务器验证,因为服务器证书也在咱们的可信任库,也会自动信任服务器端的证书。
下面的代码能够在须要的时候清除以上的环境内容
System.clearProperty(“javax.net.ssl.keyStore”);
System.clearProperty(“javax.net.ssl.keyStorePassword”);
System.clearProperty(“javax.net.ssl.keyStoreType”);
System.clearProperty(“javax.net.ssl.trustStore”);
System.clearProperty(“javax.net.ssl.trustStorePassword”);
System.clearProperty(“javax.net.ssl.trustStoreType”);