apache http server 不原生支持国密算法,需替换为国密增强版 openssl(如 gmssl),并配置国密证书、启用 sm2/sm3/sm4 套件才能实现国密 tls。

Apache HTTP Server 本身不原生支持国密(SM2/SM3/SM4)算法,SSLCertificateFile 指令仅用于加载 PEM 格式的 X.509 证书(通常是 RSA 或 ECDSA 签名的证书),无法直接加载国密证书或启用国密 TLS 协议。要实现国密改造,关键不是修改 SSLCertificateFile 的行为,而是替换底层 SSL/TLS 实现,使其支持国密套件和证书格式。
国密改造的核心路径:替换 OpenSSL 为支持国密的版本
Apache 的 mod_ssl 模块依赖 OpenSSL 提供 TLS 能力。标准 OpenSSL(1.1.1 及以前)不支持 SM2/SM3/SM4;需使用国产密码模块增强版,例如:
-
OpenSSL 国密分支(如 Baidu、Sangfor、CFCA 或中科院数据所维护的国密增强版),已集成 SM2 密钥交换、SM3 摘要、SM4 对称加密及国密 TLS 握手协议(如
TLS_SM4_SM3、TLS_SM4_SHA256); -
GMSSL(基于 OpenSSL 1.1.1 的国密增强发行版),提供完整国密算法支持和专用命令行工具(
gmssl),可生成 SM2 证书、签发国密 CSR、启动国密 HTTPS 服务。
改造前必须确认 Apache 编译时链接的是该国密增强版 OpenSSL,而非系统默认 OpenSSL。
证书与密钥准备:不能直接用 SSLCertificateFile 加载国密证书
国密证书虽可保存为 PEM 格式,但其公钥类型为 SM2,签名算法为 SM3 with SM2,标准 Apache + mod_ssl 会因不识别该公钥类型而启动失败或握手异常。正确做法是:
- 使用
gmssl req -sm2 -new -keyout server.key -out server.csr生成 SM2 密钥和 CSR; - 由支持国密的 CA(如 CFCA 国密根、各省市政务 CA)签发 SM2 证书,得到
server.crt(含 SM2 公钥 + SM2 签名); - 在 Apache 配置中仍使用
SSLCertificateFile指向server.crt,SSLCertificateKeyFile指向server.key,但前提是 mod_ssl 已动态链接 GMSSL/OpenSSL 国密版 —— 此时解析逻辑已扩展,能正确处理 SM2 结构。
启用国密 TLS 协议与密码套件
仅替换 OpenSSL 不够,还需在 Apache 配置中显式启用国密套件:
- 设置
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1(保留 TLSv1.2+,国密通常基于 TLS 1.1/1.2 扩展); - 使用
SSLCipherSuite限定国密套件,例如:
SSLCipherSuite ECDHE-SM2-SM4-SM3:SM2-SM4-SM3(具体名称依所用 OpenSSL 国密分支而定,常见有EECDH-SM2-SM4-SM3、SM2-SM4-SM3等); - 添加
SSLStrictSNIVHostCheck off(部分国密实现对 SNI 处理较严格,测试阶段可临时关闭); - 建议开启
SSLHonorCipherOrder on,确保服务器优先选择国密套件。
验证与调试要点
部署后需验证是否真正启用国密:
- 用
openssl s_client -connect your.domain:443 -cipher "SM2"(需用 GMSSL 的 openssl 命令)测试能否建立连接; - 浏览器访问时,通过开发者工具 → Security 标签页查看协商的协议和套件(主流浏览器暂不支持国密,需配合国密浏览器插件或专用客户端如 红莲花浏览器、360 安全浏览器国密版);
- 检查 Apache 错误日志,确认无
unable to load certificate或unknown certificate type类报错; - 使用
gmssl version和httpd -V | grep -i ssl确认链接的 OpenSSL 版本及路径是否为国密版。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










