Apache支持国密需三步:换GMSSL等国密增强版OpenSSL库、用GMSSL工具生成SM2证书并配置、在SSL配置中启用ECDHE-SM2-SM4-SM3等国密套件,缺一不可。
apache 的 mod_ssl 本身不支持国密算法(sm2/sm3/sm4),它只是 openssl 的封装模块。真正决定能否启用国密的,是 apache 编译时链接的 openssl 库版本——必须换成支持国密的增强版(如 gmssl 或国密分支 openssl),而不是配置 mod_ssl 指令本身。
所以,“配置支持国密算法套件”的核心不是改 mod_ssl 参数,而是三步走:换底层库、配证书、启套件。
✅ 替换 OpenSSL 为国密增强版
标准 OpenSSL(包括 1.1.1、3.0.x)原生不支持 SM2/SM3/SM4。你必须:
- 下载并安装 GMSSL(推荐:https://www.php.cn/link/550730a8ac07ca5a875783e526529bfb)或可信机构维护的国密 OpenSSL 分支(如中科院、CFCA、Sangfor 版本);
- 安装路径例如
/usr/local/gmssl; -
重新编译 Apache,确保
--with-ssl=/usr/local/gmssl,且ldd $(which httpd) | grep ssl显示链接的是libssl.so和libcrypto.so来自该路径; - 验证:
/usr/local/gmssl/bin/gmssl version应输出含GMSSL字样;httpd -V | grep SSL应显示SSL library: /usr/local/gmssl。
⚠️ 若跳过这步,直接在配置里写 SM 套件,Apache 启动会失败或 TLS 握手直接断开。
✅ 准备并加载国密证书与密钥
国密证书仍是 PEM 格式,但内容为 SM2 公钥 + SM3 签名,标准 OpenSSL 无法解析。需用 GMSSL 工具生成和签发:
- 生成 SM2 密钥和 CSR:
gmssl genpkey -algorithm sm2 -out server.key gmssl req -new -key server.key -sm2_id 1234567812345678 -out server.csr
- 交由支持国密的 CA(如 CFCA、各省市政务 CA)签发,获得
server.crt; - 在 Apache 配置中仍使用标准指令指向它们:
SSLCertificateFile "/path/to/server.crt" SSLCertificateKeyFile "/path/to/server.key"
✅ 前提是
mod_ssl已链接 GMSSL —— 此时SSLCertificateFile才能正确识别 SM2 结构。
✅ 启用国密 TLS 协议与密码套件
在 <VirtualHost *:443> 或全局 SSL 配置块中添加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 仅启用 TLSv1.2+(国密通常基于 TLS 1.1/1.2 扩展) SSLProtocol +TLSv1.2 # 明确指定国密套件(名称依所用 GMSSL 版本略有差异) SSLCipherSuite ECDHE-SM2-SM4-SM3:SM2-SM4-SM3 # 可选:关闭 SNI 严格检查(部分国密实现对 SNI 处理较敏感,调试阶段可用) SSLStrictSNIVHostCheck off # 强制服务端按套件顺序协商(建议保留) SSLHonorCipherOrder on
常见有效套件名参考(以 GMSSL 1.1.x 为例):
ECDHE-SM2-SM4-SM3EECDH-SM2-SM4-SM3SM2-SM4-SM3
? 查看当前 GMSSL 支持的套件列表:
gmssl ciphers -s -tls1_2 | grep -i sm
✅ 验证是否生效
重启 Apache 后,用以下方式确认:
- 浏览器访问(需使用支持国密的客户端,如 360 安全浏览器、红莲花浏览器、或国密版 Chrome)→ 地址栏应显示“安全”标识,开发者工具 → Security 标签页中协议显示
GMTLS或TLSv1.2+ 套件含SM2/SM4/SM3; - 命令行测试(需 GMSSL 客户端):
gmssl s_client -connect your-domain.com:443 -cipher "SM2-SM4-SM3"
成功连接且输出中含
New, GMTLSv1.2表示启用成功; - 不推荐用标准
openssl s_client测试,它不识别国密套件,会握手失败。
不复杂但容易忽略

















