Tomcat 国密 SSL证书部署要点有几项:
一、背景概述
Tomcat 本身原生支持标准的 SSL/TLS 协议(如 RSA、ECC 算法),但并不直接支持国密 SSL 协议(SM2/SM3/SM4)。在 Java 环境下部署国密 SSL,需要通过引入第三方国密安全提供者(Security Provider)和 Tomcat 国密组件来扩充 Java 的密码学能力。目前主流方案有以下几种。
二、环境准备
部署国密 SSL 前,需要确认以下基础环境:
项目 要求
操作系统 Windows / Linux / Mac 均可
JDK 版本 JDK 7 及以上,推荐 JDK 8
JDK 策略文件 需切换到无限制的安全策略文件(unlimited policy)
Tomcat 版本 Tomcat 7 / 8 / 9 均可
浏览器 支持国密的浏览器(360安全浏览器、红莲花国密浏览器、密信国密浏览器等)
三、方案一:使用 gmssl.cn 国密组件(推荐方案)
该方案由 **gmssl.cn** 提供免费的国密 SSL 组件,Tomcat 无需修改源码、无需重新编译,支持任意版本。
3.1 获取证书
国密 SSL 通常采用**双证书架构**(签名证书 + 加密证书)。可通过以下方式获取测试证书:
访问 [https://www.gmssl.cn](https://www.gmssl.cn) 免费生成国密双证书(测试用),提交后会生成 PFX 格式证书文件(默认口令 `12345678`)
也可访问 [https://www.gmcrt.cn](https://www.gmcrt.cn) 选择 SM2 证书签发,下载对应 ZIP 包
正式生产环境建议从正规 CA 机构(如沃通 WoTrus、GDCA 等)申请正式国密 SSL 证书
3.2 部署组件 JAR 包
将以下两个 JAR 包分别放置到指定目录:
JAR 包 放置位置 说明
`gmjce.jar` 和 `gmjsse.jar` `$JRE_HOME/lib/ext/` Java 国密安全提供者
`gmssl4t.jar` `$TOMCAT_HOME/lib/` Tomcat 国密连接器实现
注意:JRE 的加密策略需要先切换到 unlimited 模式,否则可能因加密强度限制导致握手失败。
3.3 配置 server.xml
编辑 `$TOMCAT_HOME/conf/server.xml`,在 `<Service>` 标签内添加以下 Connector 配置:
xml
<Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
sslImplementationName="cn.gmssl.tomcat.GMSSLImplementation"
sslProtocol="GMSSLv1.1"
keystoreFile="/path/to/your/sm2.both.pfx"
keystoreType="PKCS12"
keystorePass="your_password">
</Connector>
配置参数说明:
`sslImplementationName`:指定国密 SSL 实现类,是关键配置项
`sslProtocol`:指定为国密协议版本 `GMSSLv1.1`
`keystoreType`:国密证书一般使用 PKCS12 格式
`keystoreFile`:PFX 格式证书文件的完整路径
`keystorePass`:证书文件的口令(测试证书默认为 `12345678`)
3.4 启动验证
启动 Tomcat 后,使用支持国密的浏览器访问 `https://your-domain:443`,正常显示页面即表示国密 SSL 配置成功。
四、方案二:使用 GMSSL 双栈自适应方案(生产推荐)
国密 SSL证书 部署面临的核心挑战是:多数主流浏览器(Chrome、Safari、Firefox)尚未原生支持国密算法。目前主流的平滑部署方案是 “国密国际双证书双算法”架构,即服务器同时部署国密 SM2 证书和国际 RSA/ECC 证书。
4.1 原理说明
国密证书链:使用 SM2 算法签发,由国密根证书信任
国际证书链:使用 RSA/ECC 算法签发,由国际根证书信任
自适应切换:支持国密的浏览器优先发起国密握手;普通浏览器自动回退至国际标准握手
4.2 证书文件准备
该方案需要准备三证书 PKCS#12 文件:
证书文件 说明
`sm2_rsa.pfx` 三证书文件,包含 SM2 签名证书/私钥、SM2 加密证书/私钥、RSA 证书/私钥
相比单纯国密证书(`sm2.pfx`),三证书文件 `sm2_rsa.pfx` 可以实现 RSA 和国密 SSL 的自适应兼容,同时支持国密浏览器和普通浏览器访问。
4.3 配置 server.xml
xml
<Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
sslImplementationName="cn.gmssl.tomcat.GMSSLImplementation"
sslProtocol="GMSSLv1.1"
keystoreFile="/path/to/tomcat/certs/sm2_rsa.pfx"
keystoreType="PKCS12"
keystorePass="12345678">
</Connector>
4.4 验证要点
浏览器类型 预期结果
Chrome / Firefox 通过 RSA SSL 正常访问
360安全浏览器 / 红莲花 / 密信 通过国密 SSL 正常访问
五、方案三:使用 BGMProvider / 毕昇 JDK
对于需要更深入集成的场景(如 JCA 编程、国密算法 SDK 开发),可以考虑使用 BGMProvider(国密算法 Java 安全提供者)。
5.1 核心要点
BGMProvider 的国密算法实现依赖于 BouncyCastle
可通过毕昇 JDK 的 `keytool` 工具集成 BGMProvider 生成国密双证书
支持 GMTLS 国密 TLS 客户端和服务端
5.2 证书合并(重要提示)
国密需要两本证书(加密证书和签名证书),传统的 `keytool` 工具不支持国密证书合并功能。解决方法是在 JDK 中添加 BGMProvider,然后使用支持国密的 keytool 工具将多本证书合并到一个 keystore 中。
六、常见问题与故障排查
6.1 SSLPeerUnverifiedException: peer not authenticated
现象:配置国密 HTTPS 后,访问静态文件出现 500 错误,报错 `SSLPeerUnverifiedException: peer not authenticated`,但一小部分静态文件访问正常。
排查建议:
1. 将 Tomcat 和“国密 SSL”拆开测试:先用普通 SSL 证书测试 Tomcat,确认 Tomcat 本身配置正常
2. 用其他服务器(如 Nginx)配置同一套国密证书,验证证书本身是否有效
3. 该问题通常仅在国密 SSL 场景下出现,自签的 RSA 证书无此问题,说明可能与国密组件兼容性相关
6.2 Tomcat 启动时 JAR 包未生效
现象:使用 `systemctl start tomcat` 启动时,国密组件 JAR 包似乎未被加载。
解决:改用 `sh startup.sh` 直接启动 Tomcat 可解决此问题。
6.3 证书格式注意事项
JKS 是 Java 专用的密钥库格式,适合主要在 Java 环境下使用;PFX/PKCS12 是通用格式,被 Java 及其他平台广泛支持
建议将证书文件存放在安全的外部目录(如 `/etc/ssl/cert`),并设置严格的文件权限,只允许 Tomcat 运行用户读取
七、总结与建议
方案 适用场景 优缺点
gmssl.cn 组件方案 快速部署、测试验证、等保合规 配置简单,组件免费,无需改源码;生产可用性需验证
双证书自适应方案 生产环境,需同时兼容国密浏览器和主流浏览器 兼容性最好,是多数行业标配方案
BGMProvider 方案 深度开发、国密算法 SDK 集成 灵活性高,实现复杂度也更高
核心建议:
1. 测试环境:使用 gmssl.cn 免费组件快速验证
2. 生产环境:采用“国密国际双证书双算法”方案,确保证书来源正规(从沃通、GDCA 等合规 CA 机构申请)
3. 浏览器支持:务必准备支持国密的浏览器(360安全浏览器、红莲花国密浏览器、密信浏览器等)进行测试
4. 安全合规:部署后确保满足等保 2.0 和密评合规要求