国密SSL证书(SM2/SM3/SM4)的配置不同于国际通用的RSA/ECC证书,其核心在于支持国密算法栈的完整链路部署:包括证书签发、私钥生成、Web服务器配置以及客户端兼容性处理。配置过程需确保从密钥对生成开始即使用SM2算法,并在服务端启用国密套件(如TLS_SM4_GCM_SM3),同时考虑浏览器或终端的信任链是否包含国密根证书。
主题锚点句 本文讨论基于SM2算法的国密SSL证书在主流Web服务器上的部署流程与兼容性实践,适用于已获取SM2证书及对应SM2私钥的场景。国密SSL证书依赖于中国国家密码管理局发布的SM2(非对称加密)、SM3(哈希)、SM4(对称加密)算法体系。与国际TLS协议不同,标准TLS 1.2/1.3并未原生定义国密套件,因此实际部署中通常采用双证书模式或专用中间件支持。
由于主流浏览器(Chrome、Firefox、Safari)不信任国密根CA,生产环境中常采用“双证书”架构:服务器同时加载RSA/ECC证书和SM2证书,通过SNI或UA判断返回对应证书。部分国产浏览器(如红莲花、奇安信浏览器)可识别TLS_ECDHE_SM2_SM3等扩展套件。
标准 OpenSSL 不支持 SM 算法。需使用集成国密补丁的版本,例如:
这些实现扩展了--sm2参数用于密钥生成,并在ssl_ciphers中添加SM4-GCM-SM3等套件。
以下为基于GmSSL编译版Nginx的典型配置片段:
server {
listen 443 ssl;
server_name example.com;
# 国密证书与私钥
ssl_certificate /etc/nginx/certs/sm2_chain.pem;
ssl_certificate_key /etc/nginx/certs/sm2.key;
# 支持国际算法回退
ssl_certificate /etc/nginx/certs/rsa_chain.pem;
ssl_certificate_key /etc/nginx/certs/rsa.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-SM4-GCM-SM3:ECDHE-RSA-AES128-GCM-SHA256;
# 启用OCSP Stapling(若支持)
ssl_stapling on;
ssl_trusted_certificate /etc/nginx/certs/trust_chain.pem;
}注意:同一server块中声明多个ssl_certificate时,支持国密的客户端将优先选择SM2证书。
国密证书链必须完整包含:站点证书 → 中级CA → 根CA(SM2)。常见颁发机构包括:CFCA、华测、vTrus(部分型号支持)。链文件应按顺序拼接,根证书不可省略。
SM2私钥建议使用PKCS#8 PEM格式存储,并设置文件权限为600。避免使用弱口令保护私钥,尤其在自动化续期场景下易引发启动失败。
当前最大挑战是客户端广泛性支持不足。普通用户使用Chrome或Safari访问仅部署SM2证书的站点将触发NET::ERR_CERT_AUTHORITY_INVALID错误。
| 维度 | 参考标准 | 工程师建议 |
|---|---|---|
| 浏览器支持 | 仅国产定制浏览器 | 面向政府、金融内网系统时可行;公众网站建议双栈 |
| 移动端支持 | 鸿蒙/部分安卓定制ROM | iOS完全不支持,需明确用户设备类型 |
| Java应用集成 | 需Bouncy Castle + 国密Provider | 测试TLS握手是否成功,避免JCE限制 |
Q:如何测试国密站点是否正常工作?
A:使用支持国密的浏览器(如红莲花)或命令行工具gmssl s_client -connect example.com:443进行连接测试。
Q:能否自动续期国密SSL证书?
A:可以,但需确保ACME客户端支持国密API接口。目前Let’s Encrypt不支持,部分国产CA提供私有API对接。
加密您的网站,赢得客户信任!