利用keytool实现tomcat双向SSL认证
前言
本文介绍如何实现tomcat服务器的双向SSL认证,这里使用keytool工具生成自签名证书。在真正的商用系统中建议向CA付费购买证书。
生成tomcat服务器证书
keytool -genkeypair -alias tomcat -storetype PKCS12 -keystore tomcat.jks -storepass 12345678 -keyalg RSA
注意这里必须使用RSA算法(其它算法的证书需要在tomcat的server.xml中修改配置,请读者自行研究)。证书库也可以为.keystore格式。
What is your first and last name?必须是tomcat部署主机的域名或者IP[如:hxc.com 或者 10.20.90.198](就是你将来要在浏览器中输入的访问地址),否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。在本地做开发测试时,可填入"localhost"。
导出tomcat服务器证书
从证书库tomcat.jks中将tomcat服务器证书导出,用于后续在客户端上安装该证书
keytool -exportcert -alias tomcat -keystore tomcat.jks -storepass 12345678 -file tomcat.cer
生成客户端证书
keytool -genkeypair -alias mykey -storetype PKCS12 -keystore mykey.pfx -storepass 12345678 -keyalg RSA
注意这里必须使用RSA算法(其它算法的证书需要在tomcat的server.xml中修改配置,请读者自行研究)。生成的mykey为pfx或p12格式均可。
导出客户端证书
从mykey.pfx中将客户端证书导出,用于导入tomcat服务器证书库(pfx证书无法直接导入)
keytool -exportcert -alias mykey -keystore mykey.pfx -storepass 12345678 -file mykey.cer
将客户端证书导入tomcat服务器证书库
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。
keytool -importcert -file mykey.cer -keystore tomcat.jks -storepass 12345678
查看tomcat服务器证书库
我们可以查看一下tomcat服务器证书库,确认是否导入成功。
keytool -list -keystore tomcat.jks -storepass 12345678
tomcat服务器的server.xml文件配置
我们需要修改{TOMCAT_HOME}/conf/server.xml文件的配置,将tomcat.jks路径配置进去,修改如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS"
keystoreFile="/opt/hxc/tomcat.jks" keystorePass="12345678"
truststoreFile="/opt/hxc/tomcat.jks" truststorePass="12345678">
</Connector>
属性说明:
clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
keystoreFile:服务器证书文件路径
keystorePass:服务器证书密码
truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
truststorePass:根证书密码
重启tomcat后可以访问页面看一下(由于目前客户端没有安装证书,还无法建立安全连接)
客户端安装证书
将之前操作产生的tomcat.cer安装至“受信任的根证书颁发机构”
将mykey.pfx安装至“个人”
测试服务端
使用浏览器访问https://10.20.90.198:8443/(你的tomcat服务器地址)
可以看到会让你选择mykey证书进行登录
登录后可以看到地址栏右上角有一个锁的标志,且提示“与该服务器的这次连接是加密的”
附录:tomcat10的server.xml文件配置
经实践发现,tomcat10版本配置与tomcat8、9的稍有不同,需要将tomcat.jks配置在<SSLHostConfig>
中,其余操作步骤均相同
<Connector port="8445" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
sslProtocol="TLS">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/opt/hxc/tomcat.jks"
certificateKeystorePassword="12345678"
type="RSA" />
</SSLHostConfig>
</Connector>