在  Linux  系统的  Nginx  服务器上部署国密SS 证书,核心思路是:编译一个集成了国密算法库(如  GmSSL  或  Tongsuo)的  Nginx,因为官方原版  Nginx  并不支持国密算法。

一、准备工作

开始之前,请确保满足以下条件:

1.    已获取国密  SSL  证书:通常包含签名证书(`sign.crt`)、签名私钥(`sign.key`)、加密证书(`encrypt.crt`)和加密私钥(`encrypt.key`)四个文件。

2.    服务器环境就绪:

              拥有服务器的  `root`  或  `sudo`  权限。

              确保域名已正确解析到服务器  IP。

              务必开启服务器上的  `443`  端口,并在云服务商的安全组中放行该端口。

3.    安装基础编译工具(以  CentOS  为例):

        bash

        yum  install  -y  gcc  gcc-c++  pcre-devel  zlib-devel

步骤一:编译安装支持国密的  Nginx

这一步是核心,我们需要下载国密算法库和  Nginx  源码,然后一同编译。

方案一:使用  GmSSL(老牌方案)

1.    下载并安装  GmSSL:

        bash

          进入常用软件目录

        cd  /usr/local

          从  GmSSL  官网下载国密版  openssl(请替换为实际下载链接)

        wget  https://www.gmssl.cn/gmssl/gmssl_openssl_1.1_b8.tar.gz

        tar  xzfm  gmssl_openssl_1.1_b8.tar.gz

          解压后目录通常为  /usr/local/gmssl

2.    下载  Nginx  源码并编译:

        bash

          下载  Nginx  源码(以  1.18.0  版本为例)

        wget  http://nginx.org/download/nginx-1.18.0.tar.gz

        tar  -zxvf  nginx-1.18.0.tar.gz

        cd  nginx-1.18.0

          配置编译选项,关键是指定国密  openssl  路径

        ./configure  \

                prefix=/usr/local/nginx  \

                with-http_ssl_module  \

                with-openssl=/usr/local/gmssl  \

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

                with-ld-opt="-lm"

          编译并安装

        make  &&  make  install

  方案二:使用  Tongsuo(推荐,更活跃)

Tongsuo(原  BabaSSL)是另一个活跃的国密库,与  OpenSSL  API  兼容性更好。

1.    下载并编译  Tongsuo:

        bash

        cd  /usr/local

          克隆  Tongsuo  源码(或下载  release  包)

        git  clone  https://github.com/Tongsuo-Project/Tongsuo.git

        cd  Tongsuo

        ./config  --prefix=/usr/local/tongsuo  shared

        make  &&  make  install

2.    下载  Nginx  源码并编译:

        bash

        cd  /usr/local

        wget  http://nginx.org/download/nginx-1.18.0.tar.gz

        tar  -zxvf  nginx-1.18.0.tar.gz

        cd  nginx-1.18.0

          配置时指向  Tongsuo,并开启  ntls  支持

        ./configure  \

                prefix=/usr/local/nginx  \

                with-http_ssl_module  \

                with-openssl=/usr/local/tongsuo  \

                with-openssl-opt=enable-ntls  \

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

                with-ld-opt="-L/usr/local/tongsuo/lib  -lm"

        make  &&  make  install

提示:编译中若遇到  `ssl.h`  相关错误,可检查并修改  `nginx-1.18.0/auto/lib/openssl/conf`  文件,确保  `CORE_INCS`  等变量正确指向了国密库的  include  和  lib  目录。

骤二:上传证书文件步

在  Nginx  配置目录下创建文件夹并上传证书文件:

bash

mkdir  /usr/local/nginx/conf/cert

使用  scp  或  FTP  工具将四个证书文件上传至该目录

步骤三:配置  Nginx

编辑  Nginx  配置文件  `/usr/local/nginx/conf/nginx.conf`,在  `server`  块中添加如下配置。

二、纯国密配置

nginx

server  {

        listen  443  ssl;

        server_name  your-domain.com;

      开启国密(Tongsuo  使用  ssl_ntls)

        ssl_ntls  on;

        ssl_protocols  TLSv1.1  TLSv1.2  TLSv1.3;

          指定国密加密套件

        ssl_ciphers  "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3";

        ssl_prefer_server_ciphers  on;

        双证书配置:签名证书+加密证书

        ssl_certificate  cert/your-domain_sign.crt  cert/your-domain_encrypt.crt;

        ssl_certificate_key  cert/your-domain_sign.key  cert/your-domain_encrypt.key;

        站点根目录等其它配置...

}

  双证书(SM2+RSA)配置(推荐)

为兼顾不支持国密的浏览器,可采用双证书方案。你需要额外准备一套  RSA  证书。

nginx

server  {

        listen  443  ssl;

        server_name  your-domain.com;

        国密证书配置

        ssl_ntls  on;

        ssl_protocols  TLSv1.1  TLSv1.2  TLSv1.3;

        ssl_ciphers  "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3";

        ssl_prefer_server_ciphers  on;

        ssl_certificate  cert/your-domain_sign.crt  cert/your-domain_encrypt.crt;

        ssl_certificate_key  cert/your-domain_sign.key  cert/your-domain_encrypt.key;

        RSA  证书配置(作为  fallback)

        ssl_certificate  cert/your-domain_rsa.crt;

        ssl_certificate_key  cert/your-domain_rsa.key;

          其余配置...

}

步骤四:验证与测试

1.    检查配置文件语法:

        bash

        /usr/local/nginx/sbin/nginx  -t

        若显示  `syntax  is  ok`  和  `test  is  successful`  则配置无误。

2.    启动或重启  Nginx:

        bash

        /usr/local/nginx/sbin/nginx  -s  reload

  3.    验证部署结果:

              浏览器访问:使用支持国密的浏览器(如密信浏览器、红莲花浏览器或开启“国密SSL通信”开关的奇安信浏览器)访问你的域名,查看是否能正常打开并显示安全锁标。

              命令行测试(如果  `openssl`  支持国密):

                bash

                openssl  s_client  -connect  your-domain.com:443  -ntls

  常见问题

      编译报错:通常是缺少依赖包,请确保已安装  `gcc`、`pcre-devel`、`zlib-devel`  等。

      无法启用  HTTPS:检查服务器防火墙和云服务商安全组是否已开放  `443`  端口。

      浏览器提示不安全:确认访问的域名与证书绑定的域名完全一致。

      证书加载失败:检查证书文件路径和权限,确保证书格式为  PEM。

按照以上步骤操作,应该能顺利完成国密  SSL证书的部署。