本文将指导您如何在Linux操作系统中的Nginx服务器上,配置国密标准SSL数字证书,具体包括证书文件的下载与上传、在Nginx上配置证书文件参数,以及安装证书后的结果验证。
本文以Linux操作系统、Nginx 1.18.0、Wosign DV国密SSL证书为例。不同版本的操作系统和Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务。
背景信息
国密SSL证书是指根据中国国家密码局制定的密码算法标准所生成的SSL证书,主要用于满足企业对HTTPS协议国产化改造及国密算法应用的合规要求。如果您的Web应用服务器仅部署了国密SSL证书,则只能在支持国密算法的浏览器中访问,如密信浏览器和红莲花浏览器。因此,为了确保与各类浏览器的兼容性,通常会采取SM2/RSA双证书部署方案。
对于已安装的Nginx,需要卸载后重新安装。由于官方版Nginx+OpenSSL不支持国密算法,因此如果要适配国密算法,需要重新编译Nginx,并指定Wosign厂商的国密SM2模块(wotrus_ssl)。
前提条件
操作步骤
步骤一:下载SSL证书
登录数字证书管理服务控制台。在左侧导航栏选择 。
在SSL证书管理页面,定位需部署的目标证书,并确认以下信息:
在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型为Nginx 的证书。
解压下载的证书压缩包,其中包含:
签名证书:
<证书绑定域名>_sm2_sign.pem
和<证书绑定域名>_sm2_sign.key
。加密证书:
<证书绑定域名>_sm2_enc.pem
和<证书绑定域名>_sm2_enc.key
。说明若申请证书时使用 OpenSSL、Keytool 等工具生成 CSR 文件,私钥文件仅保存在您本地,下载的证书包中不包含私钥。如私钥遗失,证书将无法使用,需重新购买正式证书并生成CSR和私钥。
步骤二:安装Nginx服务和Wosign(沃通)国密SM2模块
登录 Linux 服务器。
阿里云服务器
以下操作以阿里云云服务器 ECS 为例进行说明,其他类型的服务器请参照对应产品文档进行操作。
登录ECS管理控制台,在页面左侧顶部,选择目标ECS实例所在地域。
在左侧导航栏中选择
,在实例页面找到目标ECS实例,点击操作列的远程连接。在弹出的对话框中,选择通过Workbench远程连接并单击立即登录。
选择终端连接作为连接方式,输入相关认证信息,并根据页面提示完成登录,即可进入服务器终端。详细操作请参考使用Workbench登录ECS实例。
说明若系统弹出“安全组白名单开通提示”面板,请按照页面提示单击一键添加。
其他云厂商服务器
请通过对应云厂商提供的远程连接功能登录服务器终端。
非云厂商服务器(如物理服务器、IDC托管主机等)
请在本地使用SSH工具登录服务器终端。
后续部分命令因操作系统类型不同而略有差异。请根据实际的服务器操作系统,选择对应的命令操作。
RHEL/CentOS 系列:包括 Alibaba Cloud Linux、Red Hat Enterprise Linux、CentOS、AlmaLinux、Rocky Linux、Anolis OS 及其衍生版本。
Debian/Ubuntu 系列:包括 Debian、Ubuntu 及其衍生版本。
开放安全组和防火墙的 443 端口。
在服务器终端执行以下命令,检测443端口的开放情况:
RHEL/CentOS 系列
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443
如果输出
Ncat: Connected to <当前服务器公网 IP>:443
,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。Debian/Ubuntu 系列
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443
若输出
Connection to <当前服务器公网 IP> port [tcp/https] succeeded!
或[<当前服务器公网 IP>] 443 (https) open
,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。若端口未开放,可参照如下操作在安全组和防火墙中开放443端口。
安装Nginx依赖:
RHEL/CentOS 系列
sudo yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
Debian/Ubuntu 系列
sudo apt install -y gcc g++ libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev
下载Nginx安装包并解压:
wget https://nginx.org/download/nginx-1.18.0.tar.gz #解压下载完成后的安装包 tar -zxvf nginx-1.18.0.tar.gz
下载国密SM2模块并解压:
wget https://www.wotrus.com/download/wotrus_ssl.tar.gz #解压 tar -zxvf wotrus_ssl.tar.gz
安装Nginx,执行以下命令:
#进入nginx-1.18.0目录配置(wotrus_ssl2.0 根据模块解压后文件夹名称配置) ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-stream --with-http_ssl_module --with-stream_ssl_module --with-openssl=/usr/local/wotrus_ssl2.0 #编译安装 make && make install
如果编译执行过程出现报错:make[1]: *** [/usr/local/wotrus_ssl2.0/.openssl/include/openssl/ssl.h] Error 127,需要修改/usr/local/nginx1.18.0/auto/lib/openssl 目录下的 conf 文件。修改内容如下:
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
替换为:
CORE_INCS="$CORE_INCS $OPENSSL/include" CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
进入Nginx安装目录,启动Nginx:
cd /usr/local/nginx/sbin #启动nginx ./nginx
网络请求测试Nginx是否正常:
#yourdomain替换为您的域名或者IP地址 curl yourdomain
步骤三:在 Nginx 服务器配置 SSL 证书
进入Nginx服务安装目录,执行以下命令:
#在Nginx的配置文件目录下,创建一个用于存放国际(可选)和国密标准的证书cert目录。cert目录仅为示例,证书存放目录没有命名限制。 mkdir /usr/local/nginx/conf/cert
将证书文件上传至对应目录。
说明您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、Xshell或WinSCP等。如果您使用的是阿里云云服务器 ECS,上传文件具体操作,请参见使用远程桌面或Windows APP向Windows实例传输文件或上传文件到Linux云服务器。
示例:
修改Nginx配置文件
配置SSL证书,在/usr/local/nginx/conf目录下,修改nginx.conf 配置文件,添加以下配置。
server { listen 443 ssl; server_name yourdomain.com; #配置国密标准证书 ssl_certificate /usr/local/nginx/conf/cert/yourdomain.com_sm2_sign.pem; ssl_certificate_key /usr/local/nginx/conf/cert/yourdomain.com_sm2_sign.key; ssl_certificate /usr/local/nginx/conf/cert/yourdomain.com_sm2_enc.pem; ssl_certificate_key /usr/local/nginx/conf/cert/yourdomain.com_sm2_enc.key; #(可选)配置国际标准证书 ssl_certificate /usr/local/nginx/conf/cert/yourdomain.com.pem; ssl_certificate_key /usr/local/nginx/conf/cert/yourdomain.com.key; #设置ssl 的会话超时时间为 5 分钟 ssl_session_timeout 5m; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #配置ssl证书所需的加密套件 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; } }
说明以上配置仅供参考,请根据实际环境配置具体的证书目录、证书名称及域名等。
验证配置文件是否正确:
/usr/local/nginx/sbin/nginx -t
。若配置文件无误,则提示:nginx.conf test is successful,可以启动Nginx服务,如下图:如出现错误提示,请根据提示进行错误排查,并重新修改配置文件中存在的问题,直至显示正常,然后启动Nginx服务。
重启Nginx服务。
执行以下操作重启Nginx,使配置生效。
#重启Nginx服务 /usr/local/nginx/sbin/nginx -s reload
步骤四:验证SSL证书是否配置成功
请通过 HTTPS 访问您已绑定证书的域名(如
https://yourdomain.com
,yourdomain.com
需替换为实际域名)。若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。
说明Chrome 浏览器自 117 版本起,地址栏中的
已被新的
替代,需单击该图标后查看安全锁信息。
国密标准SSL数字证书需与支持国密算法的浏览器(如360、密信、红莲花浏览器)配合使用,以确保通信安全。这类浏览器能识别并启用国密算法,与部署国密标准SSL证书的服务器实现安全通信。
如仍有问题,请参考常见问题进行排查。
后续步骤(可选)
开启域名监控
建议在证书部署完成后,为域名开启域名监控功能。系统将自动检测证书有效期,并在到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控。
常见问题
安装或更新证书后,证书未生效或 HTTPS 无法访问
常见原因如下:
域名未完成备案。请参见如何查看域名解析记录以及 ICP 备案信息。
服务器安全组或防火墙未开放 443 端口。请参见开放安全组和防火墙的 443 端口。
证书的绑定域名未包含当前访问的域名。请参见如何判断绑定域名是否已匹配所有需保护的域名。
修改 Nginx 配置文件后,未重载(reload) Nginx 服务。具体操作可参见重载 Nginx 服务。
证书文件未正确替换,或 Nginx 配置未正确指定证书路径。请检查 Nginx 配置文件和所用证书文件是否为最新且有效。
域名已接入 CDN、SLB 或 WAF 等云产品,但未在相应产品中安装证书。请参阅流量经过多个云产品时证书的部署位置完成相关操作。
当前域名的 DNS 解析指向多台服务器,但证书仅在部分服务器上安装。需分别在每个服务器中安装证书。
如需进一步排查,请参考:根据浏览器错误提示解决证书部署问题 和 SSL证书部署故障自助排查指南。
如何更新(替换)Nginx 中已安装的 SSL 证书
请先备份服务器上原有的证书文件(.pem 和 .key),然后登录数字证书管理服务控制台,下载新的证书文件(.pem 和 .key),并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重载(reload)Nginx 服务,使新证书生效。
如何查找 Nginx 使用的配置文件
在终端执行 ps -ef | grep '[n]ginx: master' | grep -- ' -c '
,若输出类似 -c /etc/nginx/custom.conf
,则 Nginx 使用的是 /etc/nginx/custom.conf
配置文件;否则执行 nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'
查看其默认配置文件路径(如 --conf-path=/etc/nginx/nginx.conf
,表示默认使用 /etc/nginx/nginx.conf
)。
如何在 Nginx 中关闭 TLSv1.0 和 TLSv1.1 以避免部分浏览器提示“证书不符合标准”
在 Nginx 监听 443 端口的 server 块中,将 ssl_protocols
仅保留 TLSv1.2 和 TLSv1.3,最终配置为ssl_protocols TLSv1.2 TLSv1.3;
。此时将禁用不安全的 TLSv1.0 和 TLSv1.1。配置完成后,执行 nginx -s reload
使设置生效。
测试配置文件报错:cannot load certificate "/etc/nginx/ssl/domain.pem" : BIO_new_file() failed
证书文件 /etc/nginx/ssl/domain.pem
的路径不正确,请将 Nginx 配置文件中的证书文件路径修改为正确的地址。
重载(reload)Nginx 时报错:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error
证书文件 /cert/3970497_demo.aliyundoc.com.pem
路径不正确,请将 Nginx 配置文件中的证书文件路径修改为正确的地址。