国密SSL是政务、金融等关键领域的法定要求,非可选技术。《密码法》第二十七条及GB/T 39786-2021强制规定传输层须支持SM2/SM3/SM4,仅RSA+AES HTTPS将被判定密码应用不合规。

明确国密SSL的合规定位
国密SSL不是技术选型的“加分项”,而是政务、金融、能源等关键信息基础设施领域的法定要求。《密码法》第二十七条明确:关键信息基础设施运营者应使用国家密码管理部门认可的商用密码算法。GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》也规定,传输层必须支持SM2/SM3/SM4,并优先采用ECC-SM4-GCM-SM3等国密套件。这意味着仅部署RSA+AES的HTTPS站点,在等保测评或密码应用安全性评估中将直接被判定为“密码应用不合规”。
核心组件版本必须严格匹配
当前生产环境最稳妥的组合是:GmSSL v2.5.4(非v3) + Nginx 1.21.x 或 1.24.0。GmSSL v3虽支持TLS 1.3,但其API已重构,与Nginx源码深度耦合,官方提供的nginx-with-GmSSLv3补丁在实际部署中存在握手失败风险。而v2系列完全兼容OpenSSL ABI,可无缝替换系统OpenSSL路径供Nginx调用。编译时必须启用shared参数,否则Nginx链接会因找不到动态库而报错“undefined symbol”。
- 验证GmSSL安装:执行
/usr/local/gmssl/bin/gmssl version -a,输出中需同时显示“GmSSL x.x.x”和“OpenSSL 1.1.x”字样 - 避免系统冲突:安装后立即创建软链接
ln -sf /usr/local/gmssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1,防止Nginx误调系统默认OpenSSL库
Nginx编译配置的关键修改点
标准Nginx源码需手动调整两处才能正确识别GmSSL路径:
- 编辑
auto/lib/openssl/conf,将所有$OPENSSL/.openssl/替换为$OPENSSL/(注意末尾斜杠) - configure命令中
--with-openssl指向GmSSL安装根目录,而非其子目录;--with-cc-opt需显式添加头文件路径,--with-ld-opt="-lm"不可省略,否则SM3哈希计算会链接失败
完整命令示例:
--with-http_ssl_module \
--with-http_v2_module \
--with-openssl="/usr/local/gmssl" \
--with-cc-opt="-I/usr/local/gmssl/include" \
--with-ld-opt="-L/usr/local/gmssl/lib -lm"
证书部署与Nginx配置要点
国密站点必须同时加载签名证书(SM2签名)和加密证书(SM2密钥交换),二者私钥独立:
- 证书文件命名规范:
domain_sm2_sign.pem(签名证书)、domain_sm2_enc.pem(加密证书) - Nginx配置中需用两条
ssl_certificate指令分别指定,且顺序不能颠倒;对应私钥用ssl_certificate_key配对 - ciphers必须包含国密套件,例如:
ECC-SM4-GCM-SM3:ECC-SM4-CBC-SM3:HIGH:!aNULL:!MD5:!RC4
典型server块片段:
server {listen 443 ssl;
server_name example.com;
ssl_protocols TLSv1.2;
ssl_ciphers ECC-SM4-GCM-SM3:ECC-SM4-CBC-SM3:HIGH:!aNULL:!MD5;!RC4;
ssl_certificate /path/to/example_sm2_sign.pem;
ssl_certificate_key /path/to/example_sm2_sign.key;
ssl_certificate /path/to/example_sm2_enc.pem;
ssl_certificate_key /path/to/example_sm2_enc.key;
}











