Tomcat支持双向认证

因为项目中需要加密传输网络,所以考虑让tomcat支持双向认证,客户端需要验证服务器的可信性,服务器端也需要验证客户端的可信性,实现如下:

1.生成服务器端的密钥,用于加密服务器端的信息:

keytool -genkey -keystore tomcat.keystore -dname "CN=Moss, OU=Moss, O=Moss, L=Xi'an, ST=Shanxi, C=CN" -validity 36500 -storetype jks -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keypass tomcat -storepass tomcat -alias tomcat

2. 生成客户端的个人证书(P12):

浏览器连接服务器用的钥匙,服务器只是信任密钥,用户需要在使用前导入P12证书证明自己的身份。

 keytool -genkey -keystore client.p12 -dname "CN=Moss, OU=Moss, O=Moss, L=Xi'an, ST=Shanxi, C=CN" -validity 36500 -storetype PKCS12 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keypass client -storepass client -alias client

3. 导出可信个人可信证书cer文件

因为PKCS12格式的文件无法直接导入密钥,需要从个人信息中提取cer格式证书。

keytool -export -file client.cer  -keystore client.p12 -storetype PKCS12 -storepass client -rfc -alias client

4. 导入个人可信证书入服务器密钥

将个人可信证书导入服务器密钥,这样客户端就作为可信源自由连接服务器。

echo y | keytool -import -v -file client.cer -keystore tomcat.keystore -storepass tomcat -alias client

导入后cer文件就没有用了,因为可信证书已经进了服务器的密钥库了,所以进行删除。

rm -f client.cer

5. 查看当前服务器端密钥证书情况

这时如果不出问题,应该是有两个证书存在,一个是服务器本身的密钥,用于加密服务器的对外的服务内容;另一个是客户端的可信证书,用于验证客户端身份;

keytool -list -keystore tomcat.keystore -storepass tomcat

如果按照上面的操作无误, 那么得到的应该如下:

密钥库类型: JKS
密钥库提供方: SUN

您的密钥库包含 2 个条目

client, 2015-6-19, trustedCertEntry,
证书指纹 (SHA1): 7D:98:5C:75:17:81:30:67:6E:66:E8:5E:6A:57:75:8E:7C:31:F5:BE
tomcat, 2015-6-19, PrivateKeyEntry,
证书指纹 (SHA1): 7D:0E:84:75:56:8D:F3:F8:7B:B1:26:80:B2:FA:71:89:F0:94:1E:FD

6. 将服务器端导出为可信机构证书

因为我们的服务器进行了加密,所以我们需要导入服务器端的可信证书来进行服务器的访问。

keytool -rfc -file tomcat.cer -keystore tomcat.keystore -export -alias tomcat -storepass tomcat

7. 总结

因为急用,所以写得有些伧俗,之后有时间喝咖啡的时候再把这段批处理调整一下,到时可以支持指定需要生成什么样的文件(可信机构证书、服务器密钥、个人证书)。

#!/bin/sh

echo "清除历史文件"
rm *.cer *.keystore *.p12

echo "生成服务器端的密钥"
keytool -genkey -keystore tomcat.keystore -dname "CN=Moss, OU=Moss, O=Moss, L=Xi'an, ST=Shanxi, C=CN" -validity 36500 -storetype jks -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keypass tomcat -storepass tomcat -alias tomcat

echo "生成客户端的证书"
keytool -genkey -keystore client.p12 -dname "CN=Moss, OU=Moss, O=Moss, L=Xi'an, ST=Shanxi, C=CN" -validity 36500 -storetype PKCS12 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keypass client -storepass client -alias client

echo "导出个人信息为cer格式的证书"
keytool -export -file client.cer  -keystore client.p12 -storetype PKCS12 -storepass client -rfc -alias client

echo "导出客户端cer证书到服务端信任里"
echo y | keytool -import -v -file client.cer -keystore tomcat.keystore -storepass tomcat -alias client

echo "可信个人证书导入,删除个人可信证书"
rm -f client.cer

echo "打印密钥信息"
keytool -list -keystore tomcat.keystore -storepass tomcat

echo "导出为客户端的导入机构证书"
keytool -rfc -file tomcat.cer -keystore tomcat.keystore -export -alias tomcat -storepass tomcat

Loading Disqus comments...
Table of Contents