配置国密Nginx多域名证书,核心在于使用支持国密算法的Nginx版本(如Tongsuo版),并正确配置多组证书。以下是完整的配置方法与关键注意事项。

一、前提条件与准备工作

1.    获取国密版Nginx:官方Nginx不支持国密,必须使用Tongsuo版Nginx或GmSSL版Nginx。

2.    申请并准备证书文件:

              确保已成功申请国密SSL证书(SM2算法)。

              如果采用SM2+RSA双证书方案(推荐),还需准备RSA证书。下载证书时选择“Nginx”类型。

              国密证书通常包括签名证书(server.crt)和加密证书(encrypt.crt)及对应的私钥。

3.    确认域名与证书匹配:证书绑定的域名必须与服务器上配置的域名严格对应。多域名证书可保护多个精确域名或通配符域名。

4.    开放端口:确保服务器防火墙和安全组已开放443端口。

二、编译国密版Nginx

通过源码编译,将国密算法库(如Tongsuo)静态编译进Nginx。

bash

  示例:配置编译选项(以GmSSL为例)

./configure  \

        --with-http_ssl_module  \

        --with-openssl="/usr/local/gmssl"  \

        --with-cc-opt="-I/usr/local/gmssl/include"  \

        --with-ld-opt="-lm"

make  &&  make  install

三 、配置多域名证书

在`nginx.conf`中,为每个域名配置独立的`server`块,并在其中指定对应的证书文件。

示例:配置单域名(双证书)

nginx

server  {

        listen  443  ssl;

        server_name  example.com;  #  替换为你的域名

          1.  配置国密双证书  (签名证书+加密证书)

        ssl_certificate  /path/to/example.com_server.crt;            #  签名证书

        ssl_certificate_key  /path/to/example.com_server.key;    #  签名私钥

        ssl_certificate  /path/to/example.com_encrypt.crt;          #  加密证书

        ssl_certificate_key  /path/to/example.com_encrypt.key;  #  加密私钥

          2.  配置国密算法套件  (以Tongsuo为例)

        ssl_protocols  TLSv1.2  TLSv1.3;

        ssl_ciphers  ECC-SM4-CBC-SM3:ECDHE-SM4-CBC-SM3:RSA-SM4-CBC-SM3;

        ssl_ecdh_curve  sm2p256v1;

          ...  其他配置

}

示例:配置多域名

多个域名,每个域名单独一个`server`块,结构完全一致。

nginx

  域名1

server  {

        listen  443  ssl;

        server_name  example1.com;

        ssl_certificate  /path/to/example1.com_server.crt;

        ssl_certificate_key  /path/to/example1.com_server.key;

        ssl_certificate  /path/to/example1.com_encrypt.crt;

        ssl_certificate_key  /path/to/example1.com_encrypt.key;

          ...  其他配置

}

  域名2

server  {

        listen  443  ssl;

        server_name  example2.com;

        ssl_certificate  /path/to/example2.com_server.crt;

        ssl_certificate_key  /path/to/example2.com_server.key;

        ssl_certificate  /path/to/example2.com_encrypt.crt;

        ssl_certificate_key  /path/to/example2.com_encrypt.key;

          ...  其他配置

}

重要提示:如果采用SM2+RSA双证书方案,需要在`server`块中同时配置SM2和RSA证书。

三、注意事项与最佳实践

1.    私钥权限安全:将私钥文件(.key)权限设置为`600`(仅所有者可读写),并确保属主为Nginx进程用户(如`nginx`或`www-data`)。

2.    证书链完整性:确保证书文件包含完整的证书链(服务器证书+中间证书)。若提供的是分离的证书链文件,需将它们合并到一个文件中。

3.    HTTP重定向:建议在每个`server`块中增加HTTP到HTTPS的强制跳转。

        nginx

        server  {

                listen  80;

                server_name  example.com;

                return  301  https://$server_name$request_uri;

        }

4.    测试与验证:修改配置后,务必用`nginx  -t`测试语法,无误后重载Nginx。使用国密浏览器(如红莲花、360安全浏览器国密版)访问测试,并检查Nginx错误日志排查问题。

5.    双证书部署(推荐):为兼顾浏览器兼容性,强烈建议部署SM2+RSA双证书。Nginx可同时配置两套证书,让国密浏览器使用SM2证书,普通浏览器回退使用RSA证书。

五、验证与测试

部署完成后,通过以下方式验证:

      浏览器测试:使用国密浏览器(如红莲花、360安全浏览器国密版)访问域名,应显示安全连接。

      命令行测试:使用支持国密的OpenSSL工具(如Tongsuo版的`openssl`)测试握手。

        bash

        openssl  s_client  -connect  example.com:443  -tls1_2  -cipher  ECC-SM4-CBC-SM3

        检查Nginx日志:查看错误日志`/var/log/nginx/error.log`,确认无SSL握手失败等异常。

总的来说,配置的核心是使用国密版Nginx、正确设置双证书以及严格管理私钥权限。