Email:Service@dogssl.com
CNY
国密SSL证书安全配置:SM2算法套件与Nginx/Apache适配
更新时间:2025-12-17 作者:国密SSL证书

当前主流 Web 服务器(Nginx、Apache)默认不支持国密算法套件,需通过定制化编译或插件扩展实现 GMSSL 适配。本文系统梳理国密SSL证书与SM2算法的技术特性,分步骤详解 Nginx 与 Apache 的国密配置流程,涵盖环境准备、证书部署、参数优化与有效性验证,为企业级国密合规改造提供可落地的技术方案。

一、国密SSL证书与SM2算法套件核心特性

1. 国密SSL证书的技术架构

国密SSL证书遵循《GMT 0024-2014 信息安全技术 公钥基础设施 数字证书格式》标准,核心构成包括:

  • 签名算法:采用 SM2withSM3,其中 SM2 为非对称加密算法(密钥长度 256 位,等效于 RSA 2048 位安全强度),SM3 为哈希算法(替代 MD5/SHA-1,抗碰撞性能更优);
  • 证书层级:分为根证书(国密局认可的 CA 机构颁发)、中间证书(二级 CA)、服务器证书(终端部署),形成完整信任链;
  • 扩展字段:包含 “国密算法标识”(OID:1.2.156.10197.1.301),用于客户端识别证书的国密属性。

2. SM2算法套件的合规要求

根据《GMT 0022-2014 信息安全技术 密码应用标识规范》,GMSSL 通信需支持以下核心算法套件:

套件标识加密组件适用场景
ECDHE-SM2-WITH-SM4-GCM-SM3密钥交换:ECDH(SM2 曲线)加密:SM4-GCM哈希验证:SM3主流场景(高安全性 + 性能平衡)
ECDHE-SM2-WITH-SM4-CBC-SM3密钥交换:ECDH(SM2 曲线):SM4-CBC > 哈希验证:SM3兼容旧版国密客户端
SM2-WITH-SM4-GCM-SM3密钥交换:RSA(国密适配):SM4-GCM > 哈希验证:SM3无 ECDHE 支持的极简场景

需注意:禁止使用 “SM2-WITH-SM4-CBC-MD5” 等弱哈希组合,且 SM4 加密模式优先选择 GCM(认证加密),避免 CBC 模式的 padding oracle 漏洞风险。

二、Nginx 服务器的国密SSL配置

Nginx 官方版本不支持 GMSSL,需基于 “国密补丁” 重新编译,或使用已集成国密模块的开源分支(如 Tengine、OpenResty 国密版)。本文以 “Nginx+OpenSSL 国密补丁” 方案为例,详解配置流程。

1. 环境准备与编译部署

(1)依赖组件安装(以 CentOS 7 为例)

# 安装编译依赖
yum install -y gcc gcc-c++ make zlib-devel pcre-devel openssl-devel
# 下载国密版OpenSSL(推荐1.1.1g-gm分支,支持SM2/SM3/SM4)
wget https://github.com/guanzhi/GmSSL/archive/refs/tags/2.5.4.tar.gz -O GmSSL-2.5.4.tar.gz
tar -zxvf GmSSL-2.5.4.tar.gz && cd GmSSL-2.5.4
# 编译安装国密OpenSSL
./config --prefix=/usr/local/gmssl shared
make && make install
# 下载Nginx源码(推荐1.20.x稳定版)
wget http://nginx.org/download/nginx-1.20.2.tar.gz && tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2

(2)国密 Nginx 编译配置

# 配置编译参数(指定国密OpenSSL路径,启用GMSSL模块)
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-openssl=/usr/local/src/GmSSL-2.5.4 \
--with-openssl-opt="enable-gmssl" \
--add-module=./nginx-http-gmssl-module  # 国密扩展模块(需提前下载)
# 编译安装
make && make install
# 验证国密支持(出现SM2/SM4算法标识即为成功)
/usr/local/nginx/sbin/nginx -V 2>&1 | grep "gmssl"

2. 国密SSL证书部署与配置

(1)证书文件准备

国密证书通常包含 3 个文件(由国密 CA 机构颁发):

  • 服务器证书:server.crt(包含 SM2 公钥与证书链);
  • 服务器私钥:server.key(SM2 私钥,需设置密码保护);
  • 根证书:root.crt(国密 CA 根证书,用于客户端信任验证)。

将证书文件放置于 Nginx 安全目录(权限设置为 600,避免泄露):

mkdir -p /usr/local/nginx/conf/gmssl
cp server.crt server.key root.crt /usr/local/nginx/conf/gmssl/
chmod 600 /usr/local/nginx/conf/gmssl/*

(2)Nginx 国密配置(nginx.conf)

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 国密SSL全局配置
    ssl_protocols TLSv1.2 TLSv1.3;  # 禁用TLSv1.0/1.1(弱协议)
    # 优先启用国密算法套件,后兼容传统算法
    ssl_ciphers ECDHE-SM2-WITH-SM4-GCM-SM3:ECDHE-SM2-WITH-SM4-CBC-SM3:ECDHE-RSA-WITH-AES-256-GCM-SHA384;
    ssl_prefer_server_ciphers on;  # 服务器主导算法选择
    ssl_session_cache shared:SSL:10m;  # 会话缓存优化
    ssl_session_timeout 10m;

    server {
        listen 443 ssl;  # 国密HTTPS默认端口
        server_name gm.example.com;  # 证书绑定域名

        # 国密证书配置
        ssl_certificate /usr/local/nginx/conf/gmssl/server.crt;
        ssl_certificate_key /usr/local/nginx/conf/gmssl/server.key;
        ssl_trusted_certificate /usr/local/nginx/conf/gmssl/root.crt;  # 根证书信任链

        # 国密扩展配置(可选,强制客户端使用国密算法)
        gmssl on;
        gmssl_ciphers ECDHE-SM2-WITH-SM4-GCM-SM3;  # 仅允许国密套件

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

3. 配置验证与问题排查

(1)服务启动与状态检查

# 启动国密Nginx
/usr/local/nginx/sbin/nginx
# 检查端口监听(443端口应处于LISTEN状态)
netstat -tulnp | grep 443

(2)国密通信验证(使用国密客户端)

# 安装国密版curl(gmssl-curl)
yum install -y gmssl-curl
# 验证国密握手(返回200 OK且包含SM2算法标识)
gmssl-curl -v https://gm.example.com 2>&1 | grep "SM2"

常见问题:

  • 私钥密码错误:启动日志提示 “unable to load private key”,需确认私钥密码正确,或通过gmssl rsa -in server.key -out server.nopass.key移除密码(生产环境不推荐);
  • 算法套件不匹配:客户端提示 “no shared cipher”,需检查ssl_ciphers配置是否包含客户端支持的国密套件。

三、Apache 服务器的国密SSL配置

Apache 通过 “mod_ssl_gm” 模块实现国密支持,需先安装国密版 OpenSSL,再编译加载国密模块。以下以 Apache 2.4.x 为例,详解配置流程。

1. 环境准备与模块编译

(1)国密 OpenSSL 依赖配置

同 3-1 步骤,确保/usr/local/gmssl路径下已安装国密版 OpenSSL,且系统环境变量指向国密库:

echo "export LD_LIBRARY_PATH=/usr/local/gmssl/lib:\$LD_LIBRARY_PATH" >> /etc/profile
source /etc/profile

(2)Apache 与国密模块编译

# 下载Apache源码(2.4.54版本)
wget https://archive.apache.org/dist/httpd/httpd-2.4.54.tar.gz && tar -zxvf httpd-2.4.54.tar.gz
# 下载国密模块(mod_ssl_gm)
wget https://github.com/immortalwrt/mod_ssl_gm/archive/refs/tags/v1.0.0.tar.gz -O mod_ssl_gm-1.0.0.tar.gz
tar -zxvf mod_ssl_gm-1.0.0.tar.gz && cp -r mod_ssl_gm-1.0.0/* httpd-2.4.54/modules/ssl/
# 编译Apache(指定国密OpenSSL路径)
cd httpd-2.4.54
./configure \
--prefix=/usr/local/apache \
--enable-ssl \
--enable-so \
--with-ssl=/usr/local/gmssl \
--enable-mods-shared=all
make && make install

2. 国密SSL证书配置(httpd-ssl.conf)

(1)证书路径配置

Module ssl_module>
    Listen 443
    _:443>
        ServerName gm.example.com
        DocumentRoot "/usr/local/apache/htdocs"

        # 国密证书配置
        SSLCertificateFile "/usr/local/apache/conf/gmssl/server.crt"
        SSLCertificateKeyFile "/usr/local/apache/conf/gmssl/server.key"
        SSLCACertificateFile "/usr/local/apache/conf/gmssl/root.crt"

        # 国密算法套件配置
        SSLCipherSuite ECDHE-SM2-WITH-SM4-GCM-SM3:ECDHE-SM2-WITH-SM4-CBC-SM3
        SSLProtocol TLSv1.2 TLSv1.3
        SSLHonorCipherOrder on  # 按配置顺序优先选择国密套件

        # 国密模块启用(强制GMSSL通信)
        GMSSLEnable on
        GMSSLCipherSuite ECDHE-SM2-WITH-SM4-GCM-SM3

        /apache/htdocs">
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
            </IfModule>

(2)配置加载与服务启动

# 启用国密模块(在httpd.conf中添加)
echo "LoadModule ssl_gm_module modules/mod_ssl_gm.so" >> /usr/local/apache/conf/httpd.conf
# 加载SSL配置文件
echo "Include conf/extra/httpd-ssl.conf" >> /usr/local/apache/conf/httpd.conf
# 启动Apache服务
/usr/local/apache/bin/apachectl start
# 验证国密模块加载
/usr/local/apache/bin/apachectl -M | grep "ssl_gm"

3. 通信验证与性能优化

(1)国密握手验证

# 使用国密工具验证算法套件
gmssl s_client -connect gm.example.com:443 -cipher ECDHE-SM2-WITH-SM4-GCM-SM3
# 成功标志:出现“Cipher is ECDHE-SM2-WITH-SM4-GCM-SM3”

(2)性能优化配置

  • 会话缓存:在 httpd-ssl.conf 中添加SSLSessionCache shmcb:/var/cache/mod_ssl/ssl_scache(512000),减少重复握手开销;
  • 线程优化:调整StartServers 5MaxRequestWorkers 150,匹配服务器 CPU 核心数(建议 1 核对应 2-4 个工作线程);
  • SSL会话超时:设置SSLSessionTimeout 300,平衡安全性与性能。

四、国密SSL配置的安全优化要点

1. 合规性强化

  • 禁用弱协议:严格禁止 TLSv1.0、TLSv1.1,仅保留 TLSv1.2/TLSv1.3(符合《GB/T 35273-2020 信息安全技术 个人信息安全规范》要求);
  • 证书有效期:国密证书有效期不超过 2 年,到期前 30 天需提前更新,避免服务中断;
  • 私钥保护:使用硬件安全模块(HSM)存储 SM2 私钥,或通过gmssl ec -in server.key -des3 -out server.enc.key加密私钥,防止泄露。

2. 防御机制配置

  • HSTS 支持:在 Nginx/Apache 中添加add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;,强制客户端使用 HTTPS;
  • OCSP Stapling:启用在线证书状态查询,Nginx 配置ssl_stapling on; ssl_stapling_verify on;,Apache 配置SSLUseStapling on;,减少客户端证书验证耗时;
  • DDoS 防护:限制 SSL 握手并发数,Nginx 配置ssl_session_cache shared:SSL:10m;,Apache 配置SSLSessionCacheTimeout 300,缓解 SSL 洪水攻击。

国密SSL证书与SM2算法的适配是企业实现密码合规的关键环节,Nginx 与 Apache 作为主流 Web 服务器,需通过定制化编译或模块扩展实现国密支持。本文通过详细的环境准备、配置实操与验证步骤,提供了可落地的国密部署方案,同时补充安全优化要点,兼顾合规性与安全性。


Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.109665s