Nginx  国密  SSL证书配置中的  ssl_certificate  指令详细分解

一、核心规则

国密证书采用“双证书”体系,签名证书和加密证书分开,因此在  Nginx  的  `ssl_certificate`  和  `ssl_certificate_key`  指令中,需要按照先签名证书、后加密证书的顺序配置,签名和加密证书的私钥可能相同也可能不同(具体取决于国密模块的实现)。这与传统  RSA  证书的单证书模式有本质区别。

国密双证书配置的核心语法结构如下:

nginx

ssl_certificate          签名证书路径;                    #  签名证书(用于身份认证)

ssl_certificate_key    签名证书私钥路径;            #  签名证书私钥

ssl_certificate          加密证书路径;                    #  加密证书(用于密钥交换)

ssl_certificate_key    加密证书私钥路径;            #  加密证书私钥

二、通用双证书配置模板

以下是一个符合国密双证书体系的通用  Nginx  `server`  块配置:

nginx

server  {

        listen  443  ssl;

        server_name    your-domain.com;                    #  您的域名

        #  ===  国密签名证书  ===

        ssl_certificate            /path/to/your_sign.crt;

        ssl_certificate_key    /path/to/your_sign.key;

        #  ===  国密加密证书(先签名后加密)  ===

        ssl_certificate            /path/to/your_encrypt.crt;

        ssl_certificate_key    /path/to/your_encrypt.key;

        #  ===  国密  TLS  协议和密码套件  ===

        #  注:GMv1  为国密协议标识,需要国密版  Nginx  支持

        ssl_protocols                GMv1  TLSv1.2  TLSv1.3;

        ssl_ciphers                    ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:!aNULL:!eNULL;

        ssl_prefer_server_ciphers  on;

        #  会话缓存

        ssl_session_cache        shared:SSL:1m;

        ssl_session_timeout    5m;

        location  /  {

                root      /var/www/html;

                index    index.html  index.htm;

        }

}

三、具体平台配置实例

1.  华为云  Nginx  国密配置示例

华为云文档提供了一套完整的配置方案,包含签名证书和加密证书的配置入口:

nginx

server  {

        listen  443  ssl;

        server_name    test.com;                                                  #  您的域名

        #  签名证书(身份认证)

        ssl_certificate            cert/server.crt;                      #  签名证书文件路径

        ssl_certificate_key    cert/server.key;                      #  签名证书私钥路径

        #  加密证书(密钥交换)

        ssl_certificate            cert/enc_server.crt;              #  加密证书文件路径

        ssl_certificate_key    cert/enc_server.key;              #  加密证书私钥路径

        ssl_session_cache        shared:SSL:1m;

        ssl_session_timeout    5m;

        ssl_protocols                TLSv1  TLSv1.1  TLSv1.2;

        ssl_ciphers                    ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA:DES-CBC3-SHA:ECC-SM4-CBC-SM3:ECC-SM4-GCM-SM3;

        ssl_prefer_server_ciphers  on;

        location  /  {

                root      html;

                index    index.html  index.htm;

        }

}

2.  沃通(WoSign)国密双证书配置示例

沃通国密证书包中通常包含签名证书(`sign.crt`)和加密证书(`en.crt`):

nginx

server  {

        listen  443  ssl;

        server_name    domain.com;

        #  RSA  证书(国际兼容)

        ssl_certificate            d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_rsa.crt;

        ssl_certificate_key    d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_rsa.key;

        #  国密签名证书

        ssl_certificate            d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sign.crt;

        ssl_certificate_key    d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sm2.key;

        #  国密加密证书

        ssl_certificate            d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_en.crt;

        ssl_certificate_key    d:/gmssl/nginx-1.16.0/conf/ssl/domain.com_sm2.key;

        #  此处签名、加密证书的私钥  key  为同一个,签名证书请在前

        ssl_session_timeout    5m;

        ssl_protocols                TlSv1.1  TLSv1.2  TLSv1.3;

        ssl_ciphers                    ECC-SM4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;

        ssl_prefer_server_ciphers  on;

        location  /  {

                root      html;

                index    index.html  index.htm;

        }

}

3.  GDCA  国密证书配置示例

国内数安时代(GDCA)的国密证书配置方式类似:

nginx

server  {

        listen  443  ssl;

        server_name    www.trustauth.cn;

        #  SM2  签名证书和私钥

        ssl_certificate            d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn_sign_chain.crt;

        ssl_certificate_key    d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn.key;

        #  SM2  加密证书(与签名证书共用同一个私钥)

        ssl_certificate            d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn_encrypt_chain.crt;

        ssl_certificate_key    d:/gmssl/gdca_nginx/conf/ssl/www.trustauth.cn.key;

        ssl_session_timeout    5m;

        ssl_ciphers                    SM2-WITH-SMS4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;

        ssl_protocols                TLSv1  TLSv1.1  TLSv1.2;

        ssl_prefer_server_ciphers  on;

        location  /  {

                root      html;

                index    index.html  index.htm;

        }

}

四、重要使用说明

要点      说明  

证书顺序          先配置签名证书(用于身份认证),后配置加密证书(用于密钥交换),顺序不可随意调换  

证书路径          路径中不能包含中文字符,例如应使用  `/usr/local/nginx/conf/cert/server.crt`  格式  

私钥匹配          签名证书和加密证书的私钥可能相同也可能不同,具体视国密模块的实现而定  

密码套件          `ssl_ciphers`  中必须包含国密套件(如  `ECC-SM4-SM3`、`SM2-WITH-SMS4-SM3`  等)  

Tengine  配置注意          Tengine  2.4.1  之前的版本需将  `ngx_tongsuo_ntls`  替换为  `ngx_openssl_ntls`  

验证命令          配置完成后建议使用  `nginx  -t`  检查语法,再使用  `systemctl  restart  nginx`  重启服务。测试国密连接时,可使用  `openssl  s_client  -connect  yourdomain.com:443  -cipher  ECC-SM4-SM3`  指定国密套件进行握手验证  

五、必备环境

官方  Nginx  主线版本不原生支持  SM2/SM3/SM4  等国产密码算法,部署国密  SSL  前需要以下任一方案:

Tengine  +  Tongsuo(铜锁/BabaSSL)组合:阿里云提供的集成方案,Tongsuo  适配了  NTLS  国密  TLS  全部特性

自编译  Nginx  +  GmSSL:下载  GmSSL  源码,替换  OpenSSL  后重新编译  Nginx,同时需要额外国密  SSH  模块(如  nginx-gm)

Nginx-with-openHiTLS:基于  openHiTLS  密码库的原生国密版本

沃通国密模块(wotrus_ssl):沃通提供的专业  SM2  国密模块,支持  Linux  和  Windows  平台

注意:国密  SSL证书的有效性验证依赖于国密浏览器(如红莲花、奇安信等)预埋的国密  CA  信任链,普通浏览器无法直接识别国密证书。