在部署支持国密算法的SSL证书时,为了确保与各类浏览器的兼容性,通常会采用SM2/RSA双证书部署方案,即您需要在服务器同时配置国际通用的RSA算法证书和国密标准的SM2算法证书。本文为您介绍如何使用Tengine+Tongsuo组合方式,在Tengine服务器上部署SM2和RSA双证书。
本文以Linux操作系统、Tongsuo 8.2.1和Tengine 2.4.1为例介绍,SSL证书为Wosign品牌的DV证书。不同版本的部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务。
背景信息
Tengine是一款开源、高性能、可扩展的Web服务器和反向代理服务器,它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。更多关于Tengine的说明,请参见Tengine官网。
Tengine已对铜锁/Tongsuo(原名BabaSSL)进行适配,并增加了对NTLS(National TLS,也称国密TLS)相关能力的支持。对于有使用国密算法进行安全通信协议需求的用户,可以直接使用Tengine+Tongsuo的组合。
铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库,如需了解更多,请参见铜锁密码库。
前提条件
操作步骤
步骤一:下载SSL证书
登录数字证书管理服务控制台。
登录数字证书管理服务控制台。在左侧导航栏选择 。
在SSL证书管理页面,定位需部署的目标证书,并确认以下信息:
在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型为Nginx 的证书。
解压下载的证书压缩包,其中包含:
签名证书:
<证书绑定域名>_sm2_sign.pem
和<证书绑定域名>_sm2_sign.key
。加密证书:
<证书绑定域名>_sm2_enc.pem
和<证书绑定域名>_sm2_enc.key
。说明若申请证书时使用 OpenSSL、Keytool 等工具生成 CSR 文件,私钥文件仅保存在您本地,下载的证书包中不包含私钥。如私钥遗失,证书将无法使用,需重新购买正式证书并生成CSR和私钥。
步骤二:在Tengine服务器安装证书
登录 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端口。
执行以下命令在Tengine服务器配置文件目录中创建证书存放目录。
cd /usr/local/tengine/conf #步骤二中指定的Tengine安装目录,请您可以根据实际配置调整。 mkdir cert #创建证书目录,命名为cert。
将证书相关文件上传到cert目录(示例中为/usr/local/tengine/conf/cert)。
说明您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、Xshell或WinSCP等。如果您使用的是阿里云云服务器 ECS,上传文件具体操作,请参见使用远程桌面或Windows APP向Windows实例传输文件或上传文件到Linux云服务器。
执行以下命令,通过包管理器安装需要使用的基础工具包:
RHEL/CentOS 系列
sudo yum -y install wget sudo yum -y install gcc gcc-c++ sudo yum -y install make sudo yum -y install pcre pcre-devel sudo yum -y install gzip sudo yum -y install zlib-devel
Debian/Ubuntu 系列
sudo apt update sudo apt install -y wget sudo apt install -y gcc g++ sudo apt install -y make sudo apt install -y libpcre3 libpcre3-dev sudo apt install -y gzip sudo apt install -y zlib1g-dev
下载安装Tongsuo和Tengine。
在服务器上执行以下命令,下载Tongsuo和Tengine。
下载Tongsuo 8.2.1并解压。
wget -c https://github.com/BabaSSL/BabaSSL/archive/refs/tags/8.2.1.tar.gz tar -zxvf 8.2.1.tar.gz #解压BabaSSL压缩包
下载Tengine 2.4.1并解压。
wget -c https://tengine.taobao.org/download/tengine-2.4.1.tar.gz tar -zxvf tengine-2.4.1.tar.gz
在Tengine解压目录下,执行以下命令,编译安装Tengine并关联Tongsuo。
复制命令后,请参考下述说明修改对应的目录:
--prefix=/usr/local/tengine:指定Tengine安装目录为/usr/local/tengine,您可以指定其他目录。
--add-module=modules/ngx_tongsuo_ntls:加载Tongsuo NTLS。Tengine 2.4.1之前的版本需将ngx_tongsuo_ntls替换为ngx_openssl_ntls。
--with-openssl=../Tongsuo-8.2.1:OpenSSL替换为Tongsuo以实现SM2。../Tongsuo-8.2.1需替换为实际Tongsuo安装路径。
./configure --prefix=/usr/local/tengine \ --add-module=modules/ngx_tongsuo_ntls \ --with-openssl=../Tongsuo-8.2.1 \ --with-openssl-opt="enable-ntls" \ --with-http_ssl_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_sni make -j make install
编辑Tengine配置文件nginx.conf(示例中文件位于/usr/local/tengine/conf),修改与证书相关的配置。配置内容如下:
server { listen 443 ssl; server_name aliyundoc.com; #需修改为对应的网站域名 # 启用NTLS。Tengine针对BabaSSL中的NTLS功能进行了适配,本文使用BabaSSL作为Tengine的底层密码库来实现通信加密的能力。 enable_ntls on; # 配置国密标准算法签名证书 ssl_sign_certificate cert/server_sign.pem; #需修改为实际证书文件路径 ssl_sign_certificate_key cert/server_sign.key; #需修改为实际私钥文件路径 # 配置国密标准算法证书 ssl_enc_certificate cert/server_enc.pem; #需修改为实际证书文件路径 ssl_enc_certificate_key cert/server_enc.key; #需修改为实际私钥文件路径 # (可选)配置国际标准算法证书 ssl_certificate cert/server_rsa.pem; #需修改为实际证书文件路径 ssl_certificate_key cert/server_rsa.key; #需修改为实际私钥文件路径 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 配置加密套件# ssl_ciphers HIGH: !aNULL: !MD5; ssl_ciphers ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3:ECDHE-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-GCM-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!RC4:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
执行如下命令,重启Tengine服务。
cd /usr/local/tengine/sbin #进入Tengine服务的可执行目录。 ./nginx -s reload #重新载入配置文件。
步骤三:验证安装是否成功
请通过 HTTPS 访问您已绑定证书的域名(如
https://yourdomain.com
,yourdomain.com
需替换为实际域名)。若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。如仍有问题,请参考常见问题进行排查。
说明Chrome 浏览器自 117 版本起,地址栏中的
已被新的
替代,需单击该图标后查看安全锁信息。
国密标准SSL数字证书需与支持国密算法的浏览器(如360、密信、红莲花浏览器)配合使用,以确保通信安全。这类浏览器能识别并启用国密算法,与部署国密标准SSL证书的服务器实现安全通信。
如仍有问题,请参考常见问题进行排查。
后续步骤(可选)
开启域名监控
建议在证书部署完成后,为域名开启域名监控功能。系统将自动检测证书有效期,并在到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控。
常见问题
安装或更新证书后,证书未生效或 HTTPS 无法访问
常见原因如下:
域名未完成备案。请参见如何查看域名解析记录以及 ICP 备案信息。
服务器安全组或防火墙未开放 443 端口。请参见开放安全组和防火墙的 443 端口。
证书的绑定域名未包含当前访问的域名。请参见如何判断绑定域名是否已匹配所有需保护的域名。
修改 Tengine 配置文件后,未重载(reload) Tengine 服务。具体操作可参见重启Tengine服务。
证书文件未正确替换,或 Tengine 配置未正确指定证书路径。请检查 Nginx 配置文件和所用证书文件是否为最新且有效。
域名已接入 CDN、SLB 或 WAF 等云产品,但未在相应产品中安装证书。请参阅云产品部署证书完成相关操作。
当前域名的 DNS 解析指向多台服务器,但证书仅在部分服务器上安装。需分别在每个服务器中安装证书。
如需进一步排查,请参考:根据浏览器错误提示解决证书部署问题 和 SSL证书部署故障自助排查指南。
如何更新(替换)Tengine 中已安装的 SSL 证书
请先备份服务器上原有的证书文件(.pem 和 .key),然后登录数字证书管理服务控制台,下载新的证书文件(.pem 和 .key),并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重载(reload)Tengine 服务,使新证书生效。
如何在 Tengine 中关闭 TLSv1.0 和 TLSv1.1 以避免部分浏览器提示“证书不符合标准”
在 Tengine 监听 443 端口的 server 块中,将 ssl_protocols
仅保留 TLSv1.2 和 TLSv1.3,最终配置为ssl_protocols TLSv1.2 TLSv1.3;
。此时将禁用不安全的 TLSv1.0 和 TLSv1.1。配置完成后,执行 nginx -s reload
使设置生效。
重载(reload)Tengine 时报错:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error
证书文件 /cert/3970497_demo.aliyundoc.com.pem
路径不正确,请将 Nginx 配置文件中的证书文件路径修改为正确的地址。