第一部分, 先说证书的申请.
这步是要到正规的 CA 公司申请正式的设备证书必须走的步骤.
1, 先生成证书的密钥对
打开命令行, 切换到某个自己新建的目录下, 执行如下命令
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, 这里的 http://www.javastar.org/ 一定要换成你实际要部署的站点的域名, 如果是在内网, 就要用服务器的 hostname, 一定不可以用 IP, 否则, 是无法建立 SSL 链接的.
OU = 翊天阁, O = 翊天阁, 这里可以替换成你自己的组织名称, 或者公司名称.
-validity 365 这里声明证书有效期为 1 年.
其他的参数自己可以参考 keytool 的使用帮助或相关文档.
好了, 成功执行上面的命令后, 我们在当前命令行所在目录得到 server.jks 文件, 这个就是包含密钥对的基本证书信息库文件.
2, 导出证书请求文件
keytool -certreq -alias server -sigalg "SHA1withRSA" -file server.pem -keypass 123456 -keystore server.jks -storepass 123456
这里可以得到一个 server.pem 的文件.
3, 向 CA 公司申请签发设备证书
将上一步得到的 server.pem 证书发送给相关的 CA 公司, CA 公司会通过这个申请签发一张设备证书, 最后我们会得到一个. cer 的文件, 比如 server.cer.
同时, 我们要取得该 CA 公司的证书链, 比如会有 CA_ROOT.cer 和 CA_CA.cer, 第一张为 CA 公司的根证书, 第二张为 CA 公司的签名证书.
4, 将 CA 根证书导入服务器证书库
keytool -import -alias CA_ROOT -keystore server.jks -trustcacerts -storepass 123456 -file CA_ROOT.cer
5, 将 CA 签名证书导入服务器证书库
keytool -import -alias CA_CA -keystore server.jks -trustcacerts -storepass 123456 -file CA_CA.cer
6, 使用 CA 签发的证书回复我们自己生成的包含私钥的证书
keytool -import -alias server -keystore server.jks -trustcacerts -storepass 123456 -file server.cer
7, 导出回复成功后的服务器证书
keytool -export -alias server -storepass 123456 -file javastar.org.cer -keystore server.jks
好了, 到这里我们需要的设备证书已经 ok 了.
最后对我们实际有用的是两个文件: server.jks, 是服务器证书库, 存储了含有私钥的服务器证书, 及其证书链, 这个就是主要的设备证书了, 是放在服务器的 SSL 配置里面; 还有一个是 javastar.org.cer, 这个是只包含服务器证书公钥的设备证书, 是发给用户, 让用户放入自己的可信任库的.
第二部分, 配置 Tomcat 的 SSL 双向链接
1, 准备客户端证书
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.
2, 导出. cer 格式的客户证书
keytool -export -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer
执行完毕得到 client.cer 证书.
3, 将客户端证书导入服务器的可信任证书库
keytool -import -v -file client.cer -keystore servertrust.keystore -storepass 123456
执行完毕得到 servertrust.keystore, 这个是给 tomcat 服务器端用的.
4, 将服务器证书导入客户端可信任证书库
keytool -import -v -file javastar.org.cer -keystore clienttrust.keystore -storepass 123456
执行完毕会得到 clienttrust.keystore 证书库, 留着备用. 同时, 也可以同样的方法, 把 CA_ROOT.cer 和 CA_CA.cer 导入.
5, 在和 tomcat 的 bin 目录并行的目录下新建一个 cert 文件夹, 把 server.jks 和 servertrust.keystore 文件拷贝进去.
6, 找到 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 实际的路径.
7, 启动或者重启 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");
转自
来源: http://www.bubuko.com/infodetail-3016895.html