利用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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具