在部署支持国密算法的SSL证书时,为了确保与各类浏览器的兼容性,通常会采用SM2/RSA双证书部署方案,即您需要在服务器同时配置国际通用的RSA算法证书和国密标准的SM2算法证书。本文为您介绍如何使用Tengine+Tongsuo组合方式,实现Tengine服务器双算法证书部署。
本文以Linux操作系统、Tongsuo 8.2.1和Tengine 2.4.1为例介绍。不同版本,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务。
背景信息
Tengine是一款开源、高性能、可扩展的Web服务器和反向代理服务器,它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。更多关于Tengine的说明,请参见Tengine官网。
Tengine已对铜锁/Tongsuo(原名BabaSSL)进行适配,并增加了对NTLS(National TLS,也称国密TLS)相关能力的支持。对于有使用国密算法进行安全通信协议需求的用户,可以直接使用Tengine+Tongsuo的组合。
铜锁/Tongsuo是一个提供现代密码学算法和安全通信协议的开源基础密码库,如需了解更多,请参见铜锁密码库。
前提条件
已通过数字证书管理服务控制台签发RSA算法和SM2算法两张证书。具体操作,请参见购买SSL证书和提交证书申请。
本文以Wosign品牌的DV证书为例介绍,您可以根据实际需要选择购买其他品牌的证书。如需了解不同品牌证书支持的加密算法,请参见根据证书加密算法选择证书。
步骤一:下载SSL证书
登录数字证书管理服务控制台。
在左侧导航栏,选择。
在SSL证书管理页面,定位到目标证书,在操作列,单击更多,然后选择下载页签。
在服务器类型为Nginx的操作列,单击下载。
解压缩已下载的SSL证书压缩包。
根据您在提交证书申请时选择的CSR生成方式,解压缩获得的文件不同,具体如下表所示。
CSR生成方式
证书压缩包包含的文件
系统生成或选择已有的CSR
RSA加密算法证书:<证书ID_证书绑定域名>.pem和<证书ID_证书绑定域名>.key
SM2加密算法证书:
签名证书:<证书绑定域名>_sm2_sign.pem和<证书绑定域名>_sm2_sign.key
加密证书:<<证书绑定域名>>_sm2_enc.pem和<<证书绑定域名>>_sm2_enc.key
手动填写
如果您填写的是通过数字证书管理服务控制台创建的CSR,下载后包含的证书文件与系统生成的一致。
如果您填写的不是通过数字证书管理服务控制台创建的CSR,下载后只包括证书文件(PEM格式),不包含证书密码或私钥文件。您可以通过证书工具,将证书文件和您持有的证书密码或私钥文件转换成所需格式。转换证书格式的具体操作,请参见证书格式转换。
步骤二:安装所使用的命令包
在服务器执行以下命令安装需要使用的软件命令包。
yum -y install wget
yum -y install gcc gcc-c++
yum -y install make
yum -y install pcre pcre-devel
yum -y install gzip
yum -y install zlib-devel
步骤三:下载安装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 Tongsuo-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服务器安装证书
执行以下命令在Tengine服务器配置文件目录中创建证书存放目录。
cd /usr/local/tengine/conf #步骤二中指定的Tengine安装目录,请您可以根据实际配置调整。 mkdir cert #创建证书目录,命名为cert。
将证书相关文件上传到cert目录(示例中为/usr/local/tengine/conf/cert)。
说明您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTy、Xshell或WinSCP等。如果您使用的阿里云云服务器 ECS,上传文件具体操作,请参见上传或下载文件(Windows)或上传文件到Linux云服务器。
编辑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; #需修改为实际私钥文件路径 # 配置RSA算法证书 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://yourdomain #需要将yourdomain替换成证书绑定的域名。
国密算法证书验证需要使用国密浏览器(例如密信浏览器)测试。
RSA算法证书使用Google、Firefox、Edge等浏览器测试。
通过浏览器访问网站时,服务器会根据浏览器对国密算法的支持情况自动切换使用相应的加密方式:
如果浏览器支持国密算法,则服务器会选择国密SM2算法证书进行HTTPS加密通信。
若使用的浏览器不支持国密算法(如大多数国际主流浏览器),则服务器将使用RSA算法证书进行HTTPS加密通信。