1. 项目概述为什么需要国密SSL证书最近在给一个对安全合规有明确要求的项目做技术选型客户明确要求必须支持国密算法。这让我不得不把目光从熟悉的RSA/ECC国际标准证书转向了国密SM2 SSL证书。如果你也遇到了类似的需求比如金融、政务、国企等领域的项目或者单纯想了解国产密码算法的落地实践那么这篇从购买到配置的完整指南或许能帮你少走不少弯路。简单来说国密SSL证书就是采用中国国家密码管理局简称国密局制定的SM2椭圆曲线公钥密码算法标准生成的SSL/TLS证书。它和我们常用的RSA证书核心区别在于算法体系。RSA基于大整数分解难题而SM2基于椭圆曲线离散对数难题在相同安全强度下SM2的密钥长度更短256位SM2约等于3072位RSA运算速度更快且是国家认可的密码算法标准。部署国密证书不仅是技术升级更是满足网络安全法、等级保护2.0等合规要求的必要步骤。不过部署国密证书有个现实问题主流浏览器如Chrome、Firefox、Safari的内置密码套件默认不支持SM2。这就意味着如果你只部署国密单证书那么用户只能用支持国密的浏览器如360安全浏览器、密信浏览器、红莲花浏览器访问。为了兼顾兼容性目前业界普遍采用“SM2/RSA双证书”部署方案即服务器同时配置国密证书和国际标准证书根据客户端能力自动协商使用。阿里云的数字证书管理服务也支持这种方案我们今天的流程就围绕它展开。整个流程可以拆解为四个核心阶段购买与申请证书、服务器环境准备与国密Nginx编译、证书部署与Nginx配置、验证与问题排查。下面我就结合在阿里云上的实操一步步带你走完。2. 第一阶段在阿里云购买与申请国密SSL证书2.1 证书选购与下单登录阿里云控制台进入“数字证书管理服务原SSL证书”。在证书选购页面你会发现证书种类繁多。对于国密证书你需要重点关注“证书类型”和“品牌”。在“证书类型”中选择“国密标准SM2”。阿里云提供的国密证书品牌主要是“沃通Wotrus”。沃通是获得国密局产品型号证书的CA机构其颁发的国密SSL证书兼容性较好。证书年限通常有1年、2年可选根据项目预算和规划选择即可。这里需要明确一点目前市面上几乎没有1年期的免费国密SSL证书。国密证书涉及国产密码算法和更严格的审核因此都是付费证书。国际标准的免费证书如Let‘s Encrypt并不支持SM2算法。在选择“绑定域名”时和普通证书一样支持单域名、多域名和通配符域名。例如如果你保护的是example.com及其所有子站可以选择通配符域名*.example.com。特别注意通配符证书只匹配一级子域名。*.example.com可以保护www.example.com、api.example.com但不能保护根域名example.com或多级子域名a.b.example.com。如果需要保护根域名必须在申请时额外添加example.com这个精确域名。2.2 证书申请与域名验证下单支付后证书状态会变为“待申请”。点击“申请”进入资料填写页面。这里有几个关键点CSR文件生成这是证书签名请求文件包含了你的公钥和公司信息。强烈建议在本地使用OpenSSL命令生成CSR和对应的私钥。虽然阿里云控制台提供“系统生成CSR”的选项但这样私钥会托管在云平台。从安全最佳实践出发私钥这种最高机密应当始终掌握在自己手中。生成SM2 CSR的命令与RSA略有不同需要支持国密的OpenSSL分支。一个更稳妥的方法是在阿里云控制台申请时先选择“系统生成CSR”以获取证书然后在部署的服务器上该服务器已安装国密版OpenSSL重新生成CSR和私钥再通过“重新签发”功能替换。我们会在环境准备环节详细说明生成方法。域名验证和普通SSL证书一样你需要证明你对域名拥有所有权。阿里云支持“DNS验证”和“文件验证”两种方式。对于云服务器DNS验证通常最方便。你只需要根据提示在域名的DNS解析商处如阿里云云解析添加一条指定的CNAME记录即可。验证通过通常需要几分钟到几小时。公司信息审核如果是OV组织验证或EV扩展验证型国密证书还需要提交营业执照等资料进行人工审核时间会更长。DV域名验证型证书则只需域名验证。审核通过后证书状态变为“已签发”。这时你就可以在控制台下载证书文件了。2.3 下载与理解证书文件包在证书列表找到已签发的国密证书点击“下载”。在服务器类型中选择“Nginx”。下载下来的是一个压缩包解压后你会看到两组文件这正是双证书方案的体现国密标准证书文件yourdomain.com_sm2_sign.pem- SM2签名证书链包含站点证书和中间CA证书yourdomain.com_sm2_sign.key- SM2签名证书的私钥如果申请时选择“系统生成CSR”则此文件不会提供私钥由阿里云托管yourdomain.com_sm2_enc.pem- SM2加密证书链yourdomain.com_sm2_enc.key- SM2加密证书的私钥同上可能不提供国际标准证书文件可选如果购买了双证书yourdomain.com.pem- RSA/ECC证书链yourdomain.com.key- RSA/ECC证书的私钥同上关键提示_sign和_enc分别对应国密SSL协议中的“签名证书”和“加密证书”这是国密TLS协议如GM/T 0024-2014 SSL VPN技术规范的双证书体系要求与RSA单证书不同。在Nginx配置中我们需要同时指定这两组证书。3. 第二阶段服务器环境准备与国密Nginx编译官方Nginx默认链接的OpenSSL库不支持国密算法。因此我们必须下载支持SM2/3/4的国密OpenSSL分支如沃通的wotrus_ssl模块并重新编译Nginx。这是整个流程中技术性最强的一步。3.1 基础环境检查与依赖安装首先登录你的Linux服务器以CentOS 7/Alibaba Cloud Linux 2为例。确保系统已安装必要的编译工具。# 更新系统包 sudo yum update -y # 安装编译依赖 sudo yum install -y gcc gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget tar检查防火墙和安全组确保443HTTPS和80HTTP可选用于重定向端口已开放。这是后续验证能否访问的关键。# 检查443端口监听状态 sudo ss -tlnp | grep :443 # 如果使用firewalld sudo firewall-cmd --permanent --add-port443/tcp sudo firewall-cmd --reload # 如果使用iptables需持久化 sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo service iptables save # 或使用iptables-persistent3.2 下载源码与国密模块选择一个合适的目录例如/usr/local/src开始下载Nginx和国密模块源码。cd /usr/local/src # 下载Nginx稳定版这里以1.18.0为例可替换为更高稳定版本如1.24.0 sudo wget https://nginx.org/download/nginx-1.18.0.tar.gz # 下载沃通国密SSL模块 (wotrus_ssl) sudo wget https://www.wotrus.com/download/wotrus_ssl.tar.gz # 解压 sudo tar -zxvf nginx-1.18.0.tar.gz sudo tar -zxvf wotrus_ssl.tar.gz解压后你会得到nginx-1.18.0目录和wotrus_ssl2.0版本号可能不同目录。3.3 编译安装国密版Nginx进入Nginx源码目录配置编译参数。核心是--with-openssl指向我们下载的国密模块源码路径。cd nginx-1.18.0 # 配置指定国密openssl路径 sudo ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-stream \ --with-stream_ssl_module \ --with-openssl/usr/local/src/wotrus_ssl2.0 # 此处路径根据实际解压目录调整执行configure后检查输出信息确认OpenSSL library指向的是我们指定的路径。然后进行编译和安装。sudo make sudo make install如果编译过程顺利Nginx就会被安装到/usr/local/nginx目录下。3.4 编译中可能遇到的坑与解决方案在实际操作中你很可能遇到编译错误。最常见的一个错误是make[1]: *** [/usr/local/src/wotrus_ssl2.0/.openssl/include/openssl/ssl.h] Error 127这是因为Nginx的编译脚本在国密模块的路径中错误地寻找了.openssl子目录。解决方法需要手动修改Nginx的一个配置文件。找到Nginx源码中的OpenSSL配置脚本find /usr/local/src/nginx-1.18.0 -name conf | grep openssl通常路径是/usr/local/src/nginx-1.18.0/auto/lib/openssl/conf。编辑这个文件sudo vi /usr/local/src/nginx-1.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修改的本质去掉路径中的/.openssl子目录直接指向国密模块源码的include和lib目录。保存退出然后返回到nginx-1.18.0目录重新执行sudo make sudo make install。实操心得编译失败时先看错误日志的最后几行。如果是关于ssl.h找不到基本就是上述路径问题。修改conf文件后务必make clean或直接删除objs目录再重新configure和make以确保修改生效。3.5 验证Nginx与国密OpenSSL安装完成后验证Nginx是否成功链接了国密OpenSSL。# 启动Nginx sudo /usr/local/nginx/sbin/nginx # 检查Nginx版本和编译参数 sudo /usr/local/nginx/sbin/nginx -V在输出的configure arguments中你应该能看到--with-openssl/usr/local/src/wotrus_ssl2.0。更重要的是可以写一个简单的测试脚本来验证SM2算法支持。# 创建一个测试HTTPS配置的简易站点 cd /usr/local/nginx/html sudo echo Hello GMSSL! index.html暂时先不配置SSL用HTTP测试Nginx是否运行正常curl http://localhost如果返回 “Hello GMSSL!”说明Nginx服务基本正常。4. 第三阶段证书部署与Nginx详细配置环境准备好后接下来就是将证书文件部署到服务器并配置Nginx以支持国密HTTPS。4.1 上传与存放证书文件在服务器上创建一个专门的目录存放证书文件例如在Nginx配置目录下sudo mkdir -p /usr/local/nginx/conf/ssl/gm_certs将你在阿里云下载的证书压缩包中的.pem和.key文件上传到这个目录。你可以使用scp命令、SFTP客户端如WinSCP或云服务器提供的文件上传功能。假设你的域名是gmtest.example.com上传后目录结构应类似/usr/local/nginx/conf/ssl/gm_certs/ ├── gmtest.example.com_sm2_sign.pem ├── gmtest.example.com_sm2_sign.key ├── gmtest.example.com_sm2_enc.pem ├── gmtest.example.com_sm2_enc.key └── (可选) gmtest.example.com.pem └── (可选) gmtest.example.com.key关键权限设置证书文件尤其是私钥文件.key必须严格限制访问权限最好仅允许root用户读取。sudo chmod 600 /usr/local/nginx/conf/ssl/gm_certs/*.key sudo chmod 644 /usr/local/nginx/conf/ssl/gm_certs/*.pem4.2 配置Nginx支持国密双证书编辑Nginx的主配置文件/usr/local/nginx/conf/nginx.conf。我们需要在http块内添加一个server块来监听443端口。http { ... # 其他原有配置 server { listen 443 ssl; # 监听443端口启用SSL server_name gmtest.example.com; # 你的域名 # ********** 国密SM2证书配置 ********** # 签名证书 ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_sign.pem; ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_sign.key; # 加密证书 ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_enc.pem; ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_enc.key; # ********** 可选国际标准RSA证书配置 ********** # 如果购买了双证书可以在此添加Nginx会根据客户端能力自动选择 # ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com.pem; # ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com.key; # SSL协议与密码套件配置 ssl_protocols TLSv1.2 TLSv1.3; # 建议禁用TLSv1.0和TLSv1.1 # 国密优先的密码套件列表 ssl_ciphers ECC-SM4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL; ssl_prefer_server_ciphers on; # 服务器优先选择密码套件 ssl_session_timeout 5m; # SSL会话超时时间 ssl_session_cache shared:SSL:10m; # SSL会话缓存 # 网站根目录等其他配置 root /usr/local/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 可以添加其他location配置如反向代理到应用 # location /api { # proxy_pass http://localhost:8080; # } } # 推荐添加一个HTTP server块将80端口请求重定向到HTTPS server { listen 80; server_name gmtest.example.com; return 301 https://$server_name$request_uri; # 永久重定向 } }配置要点解析双证书指令注意国密证书需要配置两对ssl_certificate和ssl_certificate_key指令分别对应签名和加密证书。Nginx的国密模块会识别并正确处理它们。密码套件ssl_ciphersECC-SM4-SM3是国密套件。这个配置让服务器在协商时优先提供国密套件。如果客户端如国密浏览器支持则使用国密算法连接如果不支持如Chrome则会向后协商使用后面的国际标准套件如AESGCM。这是实现双证书兼容性的关键。协议版本ssl_protocols TLSv1.2 TLSv1.3;禁用了不安全的旧协议符合安全最佳实践。4.3 配置测试与服务重载在重启Nginx之前务必测试配置文件语法是否正确。sudo /usr/local/nginx/sbin/nginx -t如果看到nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful说明配置无误。然后平滑重载Nginx配置使其生效sudo /usr/local/nginx/sbin/nginx -s reload如果Nginx尚未启动则使用sudo /usr/local/nginx/sbin/nginx5. 第四阶段验证、测试与深度问题排查配置完成后工作只完成了一半验证和排查同样重要。5.1 基础验证方法浏览器访问使用支持国密的浏览器如360安全浏览器极速模式访问https://gmtest.example.com。如果地址栏显示绿色的安全锁或国密标识点击锁图标能看到证书详细信息颁发者为“沃通”并且证书算法是“SM2”说明国密证书部署成功。命令行工具验证使用curl测试但普通curl不支持国密curl -I https://gmtest.example.com如果能返回HTTP头至少说明SSL握手在协议层面是通的可能降级到了国际标准套件。使用openssl s_client测试需要国密版openssl/usr/local/src/wotrus_ssl2.0/bin/openssl s_client -connect gmtest.example.com:443 -servername gmtest.example.com -showcerts在输出中你可以看到服务器返回的证书链和协商的密码套件。5.2 常见问题排查实录即使按照步骤操作也可能会遇到各种问题。下面是我在多次部署中总结的“排坑指南”。问题1Nginx启动或重载失败报错nginx: [emerg] cannot load certificate /path/to/cert.pem: BIO_new_file() failed (SSL: error:80000002:system library:file_open:No such file or directory)原因这是最常见的问题表示Nginx找不到证书文件或没有读取权限。排查检查路径确认nginx.conf中ssl_certificate和ssl_certificate_key指令指向的路径完全正确。一个空格或一个字符错误都会导致失败。使用绝对路径最保险。检查文件是否存在ls -la /usr/local/nginx/conf/ssl/gm_certs/查看文件是否存在。检查文件权限确保Nginx进程用户通常是nobody或www-data有读取证书文件的权限。私钥.key文件建议权限为600-rw-------证书.pem文件为644。可以尝试sudo chown root:root /path/to/key sudo chmod 600 /path/to/key。检查文件内容用cat命令查看.pem和.key文件内容是否正确。证书文件应以-----BEGIN CERTIFICATE-----开头私钥文件以-----BEGIN PRIVATE KEY-----开头。问题2HTTPS访问超时或连接被拒绝原因网络层面不通。排查检查端口监听在服务器上执行sudo netstat -tlnp | grep :443看是否有进程nginx在监听443端口。检查防火墙确认服务器本机的防火墙firewalld/iptables/ufw已放行443端口。检查安全组如果是云服务器如阿里云ECS务必在控制台检查实例所属安全组的入方向规则是否允许来自0.0.0.0/0或你指定IP段的443端口TCP流量。检查域名解析在本地电脑ping gmtest.example.com看是否解析到了正确的服务器公网IP。问题3浏览器提示“不安全”、“证书无效”或“证书不匹配”原因证书链不完整或域名不匹配。排查证书链完整.pem文件应该包含站点证书和中间CA证书通常还有根证书。你可以用文本编辑器打开.pem文件应该看到多个-----BEGIN CERTIFICATE-----块。阿里云下载的Nginx证书包通常已包含完整链。域名匹配确认浏览器访问的域名包括www前缀完全包含在证书的“使用者可选名称SAN”中。对于通配符证书*.example.com它不匹配example.com。浏览器兼容性用Chrome访问国密单证书网站肯定会报错因为Chrome不支持SM2。请使用360安全浏览器需切换到“极速模式”并开启国密支持或密信浏览器测试。这是预期行为不是配置错误。问题4国密浏览器访问仍无法建立国密连接原因Nginx配置的密码套件顺序或国密模块未生效。排查密码套件顺序确保ssl_ciphers中ECC-SM4-SM3排在前面。可以尝试更激进的配置只提供国密套件来测试ssl_ciphers ECC-SM4-SM3;。验证Nginx国密模块执行/usr/local/nginx/sbin/nginx -V 21 | grep -i sm看输出中是否包含--with-openssl指向国密模块的路径。也可以查看Nginx错误日志cat /usr/local/nginx/logs/error.log看SSL握手时是否有相关国密算法的日志。检查证书类型确认你部署的确实是国密证书SM2而不是误用了RSA证书。问题5如何更新或替换证书证书快过期时你需要用新证书替换旧文件。备份旧证书文件。在阿里云控制台申请证书续费或重新购买下载新的证书包。将新的.pem和.key文件上传到服务器覆盖旧文件确保文件名一致。执行sudo /usr/local/nginx/sbin/nginx -t测试配置。执行sudo /usr/local/nginx/sbin/nginx -s reload平滑重载。无需重启Nginx服务不会中断。5.3 高级配置与优化建议启用HTTP/2在listen 443 ssl;后面加上http2即listen 443 ssl http2;可以显著提升HTTPS网站性能。但需确认编译Nginx时包含了--with-http_v2_module默认通常已包含。OCSP装订提高证书验证速度。需要在Nginx配置中指定OCSP响应文件这需要证书颁发机构支持。沃通国密证书支持OCSP但配置稍复杂需使用ssl_stapling on;等指令。会话恢复配置ssl_session_cache和ssl_session_timeout可以减少SSL握手开销提升性能。上面的配置示例已经包含。HSTS添加HTTP严格传输安全头强制浏览器使用HTTPS。在server块中添加add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload;。注意一旦启用在max-age时间内浏览器将强制使用HTTPS请谨慎评估。部署国密SSL证书是一个涉及密码学、Web服务器和网络知识的综合性任务。整个过程最关键的环节在于国密Nginx的编译和双证书的配置。编译失败时耐心查看日志、修改路径配置完成后务必进行多维度验证。当你在国密浏览器中看到那个代表国密算法的安全锁时所有的折腾都是值得的。这不仅意味着项目满足了合规要求也标志着你在国产化技术栈的实践上迈出了扎实的一步。如果在操作中遇到其他古怪问题不妨多检查一下文件权限、路径和防火墙这三个地方往往是问题的藏身之处。
国密SSL证书部署实战:从阿里云购买到Nginx配置全流程指南
发布时间:2026/6/17 22:01:09
1. 项目概述为什么需要国密SSL证书最近在给一个对安全合规有明确要求的项目做技术选型客户明确要求必须支持国密算法。这让我不得不把目光从熟悉的RSA/ECC国际标准证书转向了国密SM2 SSL证书。如果你也遇到了类似的需求比如金融、政务、国企等领域的项目或者单纯想了解国产密码算法的落地实践那么这篇从购买到配置的完整指南或许能帮你少走不少弯路。简单来说国密SSL证书就是采用中国国家密码管理局简称国密局制定的SM2椭圆曲线公钥密码算法标准生成的SSL/TLS证书。它和我们常用的RSA证书核心区别在于算法体系。RSA基于大整数分解难题而SM2基于椭圆曲线离散对数难题在相同安全强度下SM2的密钥长度更短256位SM2约等于3072位RSA运算速度更快且是国家认可的密码算法标准。部署国密证书不仅是技术升级更是满足网络安全法、等级保护2.0等合规要求的必要步骤。不过部署国密证书有个现实问题主流浏览器如Chrome、Firefox、Safari的内置密码套件默认不支持SM2。这就意味着如果你只部署国密单证书那么用户只能用支持国密的浏览器如360安全浏览器、密信浏览器、红莲花浏览器访问。为了兼顾兼容性目前业界普遍采用“SM2/RSA双证书”部署方案即服务器同时配置国密证书和国际标准证书根据客户端能力自动协商使用。阿里云的数字证书管理服务也支持这种方案我们今天的流程就围绕它展开。整个流程可以拆解为四个核心阶段购买与申请证书、服务器环境准备与国密Nginx编译、证书部署与Nginx配置、验证与问题排查。下面我就结合在阿里云上的实操一步步带你走完。2. 第一阶段在阿里云购买与申请国密SSL证书2.1 证书选购与下单登录阿里云控制台进入“数字证书管理服务原SSL证书”。在证书选购页面你会发现证书种类繁多。对于国密证书你需要重点关注“证书类型”和“品牌”。在“证书类型”中选择“国密标准SM2”。阿里云提供的国密证书品牌主要是“沃通Wotrus”。沃通是获得国密局产品型号证书的CA机构其颁发的国密SSL证书兼容性较好。证书年限通常有1年、2年可选根据项目预算和规划选择即可。这里需要明确一点目前市面上几乎没有1年期的免费国密SSL证书。国密证书涉及国产密码算法和更严格的审核因此都是付费证书。国际标准的免费证书如Let‘s Encrypt并不支持SM2算法。在选择“绑定域名”时和普通证书一样支持单域名、多域名和通配符域名。例如如果你保护的是example.com及其所有子站可以选择通配符域名*.example.com。特别注意通配符证书只匹配一级子域名。*.example.com可以保护www.example.com、api.example.com但不能保护根域名example.com或多级子域名a.b.example.com。如果需要保护根域名必须在申请时额外添加example.com这个精确域名。2.2 证书申请与域名验证下单支付后证书状态会变为“待申请”。点击“申请”进入资料填写页面。这里有几个关键点CSR文件生成这是证书签名请求文件包含了你的公钥和公司信息。强烈建议在本地使用OpenSSL命令生成CSR和对应的私钥。虽然阿里云控制台提供“系统生成CSR”的选项但这样私钥会托管在云平台。从安全最佳实践出发私钥这种最高机密应当始终掌握在自己手中。生成SM2 CSR的命令与RSA略有不同需要支持国密的OpenSSL分支。一个更稳妥的方法是在阿里云控制台申请时先选择“系统生成CSR”以获取证书然后在部署的服务器上该服务器已安装国密版OpenSSL重新生成CSR和私钥再通过“重新签发”功能替换。我们会在环境准备环节详细说明生成方法。域名验证和普通SSL证书一样你需要证明你对域名拥有所有权。阿里云支持“DNS验证”和“文件验证”两种方式。对于云服务器DNS验证通常最方便。你只需要根据提示在域名的DNS解析商处如阿里云云解析添加一条指定的CNAME记录即可。验证通过通常需要几分钟到几小时。公司信息审核如果是OV组织验证或EV扩展验证型国密证书还需要提交营业执照等资料进行人工审核时间会更长。DV域名验证型证书则只需域名验证。审核通过后证书状态变为“已签发”。这时你就可以在控制台下载证书文件了。2.3 下载与理解证书文件包在证书列表找到已签发的国密证书点击“下载”。在服务器类型中选择“Nginx”。下载下来的是一个压缩包解压后你会看到两组文件这正是双证书方案的体现国密标准证书文件yourdomain.com_sm2_sign.pem- SM2签名证书链包含站点证书和中间CA证书yourdomain.com_sm2_sign.key- SM2签名证书的私钥如果申请时选择“系统生成CSR”则此文件不会提供私钥由阿里云托管yourdomain.com_sm2_enc.pem- SM2加密证书链yourdomain.com_sm2_enc.key- SM2加密证书的私钥同上可能不提供国际标准证书文件可选如果购买了双证书yourdomain.com.pem- RSA/ECC证书链yourdomain.com.key- RSA/ECC证书的私钥同上关键提示_sign和_enc分别对应国密SSL协议中的“签名证书”和“加密证书”这是国密TLS协议如GM/T 0024-2014 SSL VPN技术规范的双证书体系要求与RSA单证书不同。在Nginx配置中我们需要同时指定这两组证书。3. 第二阶段服务器环境准备与国密Nginx编译官方Nginx默认链接的OpenSSL库不支持国密算法。因此我们必须下载支持SM2/3/4的国密OpenSSL分支如沃通的wotrus_ssl模块并重新编译Nginx。这是整个流程中技术性最强的一步。3.1 基础环境检查与依赖安装首先登录你的Linux服务器以CentOS 7/Alibaba Cloud Linux 2为例。确保系统已安装必要的编译工具。# 更新系统包 sudo yum update -y # 安装编译依赖 sudo yum install -y gcc gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel wget tar检查防火墙和安全组确保443HTTPS和80HTTP可选用于重定向端口已开放。这是后续验证能否访问的关键。# 检查443端口监听状态 sudo ss -tlnp | grep :443 # 如果使用firewalld sudo firewall-cmd --permanent --add-port443/tcp sudo firewall-cmd --reload # 如果使用iptables需持久化 sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo service iptables save # 或使用iptables-persistent3.2 下载源码与国密模块选择一个合适的目录例如/usr/local/src开始下载Nginx和国密模块源码。cd /usr/local/src # 下载Nginx稳定版这里以1.18.0为例可替换为更高稳定版本如1.24.0 sudo wget https://nginx.org/download/nginx-1.18.0.tar.gz # 下载沃通国密SSL模块 (wotrus_ssl) sudo wget https://www.wotrus.com/download/wotrus_ssl.tar.gz # 解压 sudo tar -zxvf nginx-1.18.0.tar.gz sudo tar -zxvf wotrus_ssl.tar.gz解压后你会得到nginx-1.18.0目录和wotrus_ssl2.0版本号可能不同目录。3.3 编译安装国密版Nginx进入Nginx源码目录配置编译参数。核心是--with-openssl指向我们下载的国密模块源码路径。cd nginx-1.18.0 # 配置指定国密openssl路径 sudo ./configure --prefix/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-stream \ --with-stream_ssl_module \ --with-openssl/usr/local/src/wotrus_ssl2.0 # 此处路径根据实际解压目录调整执行configure后检查输出信息确认OpenSSL library指向的是我们指定的路径。然后进行编译和安装。sudo make sudo make install如果编译过程顺利Nginx就会被安装到/usr/local/nginx目录下。3.4 编译中可能遇到的坑与解决方案在实际操作中你很可能遇到编译错误。最常见的一个错误是make[1]: *** [/usr/local/src/wotrus_ssl2.0/.openssl/include/openssl/ssl.h] Error 127这是因为Nginx的编译脚本在国密模块的路径中错误地寻找了.openssl子目录。解决方法需要手动修改Nginx的一个配置文件。找到Nginx源码中的OpenSSL配置脚本find /usr/local/src/nginx-1.18.0 -name conf | grep openssl通常路径是/usr/local/src/nginx-1.18.0/auto/lib/openssl/conf。编辑这个文件sudo vi /usr/local/src/nginx-1.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修改的本质去掉路径中的/.openssl子目录直接指向国密模块源码的include和lib目录。保存退出然后返回到nginx-1.18.0目录重新执行sudo make sudo make install。实操心得编译失败时先看错误日志的最后几行。如果是关于ssl.h找不到基本就是上述路径问题。修改conf文件后务必make clean或直接删除objs目录再重新configure和make以确保修改生效。3.5 验证Nginx与国密OpenSSL安装完成后验证Nginx是否成功链接了国密OpenSSL。# 启动Nginx sudo /usr/local/nginx/sbin/nginx # 检查Nginx版本和编译参数 sudo /usr/local/nginx/sbin/nginx -V在输出的configure arguments中你应该能看到--with-openssl/usr/local/src/wotrus_ssl2.0。更重要的是可以写一个简单的测试脚本来验证SM2算法支持。# 创建一个测试HTTPS配置的简易站点 cd /usr/local/nginx/html sudo echo Hello GMSSL! index.html暂时先不配置SSL用HTTP测试Nginx是否运行正常curl http://localhost如果返回 “Hello GMSSL!”说明Nginx服务基本正常。4. 第三阶段证书部署与Nginx详细配置环境准备好后接下来就是将证书文件部署到服务器并配置Nginx以支持国密HTTPS。4.1 上传与存放证书文件在服务器上创建一个专门的目录存放证书文件例如在Nginx配置目录下sudo mkdir -p /usr/local/nginx/conf/ssl/gm_certs将你在阿里云下载的证书压缩包中的.pem和.key文件上传到这个目录。你可以使用scp命令、SFTP客户端如WinSCP或云服务器提供的文件上传功能。假设你的域名是gmtest.example.com上传后目录结构应类似/usr/local/nginx/conf/ssl/gm_certs/ ├── gmtest.example.com_sm2_sign.pem ├── gmtest.example.com_sm2_sign.key ├── gmtest.example.com_sm2_enc.pem ├── gmtest.example.com_sm2_enc.key └── (可选) gmtest.example.com.pem └── (可选) gmtest.example.com.key关键权限设置证书文件尤其是私钥文件.key必须严格限制访问权限最好仅允许root用户读取。sudo chmod 600 /usr/local/nginx/conf/ssl/gm_certs/*.key sudo chmod 644 /usr/local/nginx/conf/ssl/gm_certs/*.pem4.2 配置Nginx支持国密双证书编辑Nginx的主配置文件/usr/local/nginx/conf/nginx.conf。我们需要在http块内添加一个server块来监听443端口。http { ... # 其他原有配置 server { listen 443 ssl; # 监听443端口启用SSL server_name gmtest.example.com; # 你的域名 # ********** 国密SM2证书配置 ********** # 签名证书 ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_sign.pem; ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_sign.key; # 加密证书 ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_enc.pem; ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com_sm2_enc.key; # ********** 可选国际标准RSA证书配置 ********** # 如果购买了双证书可以在此添加Nginx会根据客户端能力自动选择 # ssl_certificate /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com.pem; # ssl_certificate_key /usr/local/nginx/conf/ssl/gm_certs/gmtest.example.com.key; # SSL协议与密码套件配置 ssl_protocols TLSv1.2 TLSv1.3; # 建议禁用TLSv1.0和TLSv1.1 # 国密优先的密码套件列表 ssl_ciphers ECC-SM4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL; ssl_prefer_server_ciphers on; # 服务器优先选择密码套件 ssl_session_timeout 5m; # SSL会话超时时间 ssl_session_cache shared:SSL:10m; # SSL会话缓存 # 网站根目录等其他配置 root /usr/local/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 可以添加其他location配置如反向代理到应用 # location /api { # proxy_pass http://localhost:8080; # } } # 推荐添加一个HTTP server块将80端口请求重定向到HTTPS server { listen 80; server_name gmtest.example.com; return 301 https://$server_name$request_uri; # 永久重定向 } }配置要点解析双证书指令注意国密证书需要配置两对ssl_certificate和ssl_certificate_key指令分别对应签名和加密证书。Nginx的国密模块会识别并正确处理它们。密码套件ssl_ciphersECC-SM4-SM3是国密套件。这个配置让服务器在协商时优先提供国密套件。如果客户端如国密浏览器支持则使用国密算法连接如果不支持如Chrome则会向后协商使用后面的国际标准套件如AESGCM。这是实现双证书兼容性的关键。协议版本ssl_protocols TLSv1.2 TLSv1.3;禁用了不安全的旧协议符合安全最佳实践。4.3 配置测试与服务重载在重启Nginx之前务必测试配置文件语法是否正确。sudo /usr/local/nginx/sbin/nginx -t如果看到nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful说明配置无误。然后平滑重载Nginx配置使其生效sudo /usr/local/nginx/sbin/nginx -s reload如果Nginx尚未启动则使用sudo /usr/local/nginx/sbin/nginx5. 第四阶段验证、测试与深度问题排查配置完成后工作只完成了一半验证和排查同样重要。5.1 基础验证方法浏览器访问使用支持国密的浏览器如360安全浏览器极速模式访问https://gmtest.example.com。如果地址栏显示绿色的安全锁或国密标识点击锁图标能看到证书详细信息颁发者为“沃通”并且证书算法是“SM2”说明国密证书部署成功。命令行工具验证使用curl测试但普通curl不支持国密curl -I https://gmtest.example.com如果能返回HTTP头至少说明SSL握手在协议层面是通的可能降级到了国际标准套件。使用openssl s_client测试需要国密版openssl/usr/local/src/wotrus_ssl2.0/bin/openssl s_client -connect gmtest.example.com:443 -servername gmtest.example.com -showcerts在输出中你可以看到服务器返回的证书链和协商的密码套件。5.2 常见问题排查实录即使按照步骤操作也可能会遇到各种问题。下面是我在多次部署中总结的“排坑指南”。问题1Nginx启动或重载失败报错nginx: [emerg] cannot load certificate /path/to/cert.pem: BIO_new_file() failed (SSL: error:80000002:system library:file_open:No such file or directory)原因这是最常见的问题表示Nginx找不到证书文件或没有读取权限。排查检查路径确认nginx.conf中ssl_certificate和ssl_certificate_key指令指向的路径完全正确。一个空格或一个字符错误都会导致失败。使用绝对路径最保险。检查文件是否存在ls -la /usr/local/nginx/conf/ssl/gm_certs/查看文件是否存在。检查文件权限确保Nginx进程用户通常是nobody或www-data有读取证书文件的权限。私钥.key文件建议权限为600-rw-------证书.pem文件为644。可以尝试sudo chown root:root /path/to/key sudo chmod 600 /path/to/key。检查文件内容用cat命令查看.pem和.key文件内容是否正确。证书文件应以-----BEGIN CERTIFICATE-----开头私钥文件以-----BEGIN PRIVATE KEY-----开头。问题2HTTPS访问超时或连接被拒绝原因网络层面不通。排查检查端口监听在服务器上执行sudo netstat -tlnp | grep :443看是否有进程nginx在监听443端口。检查防火墙确认服务器本机的防火墙firewalld/iptables/ufw已放行443端口。检查安全组如果是云服务器如阿里云ECS务必在控制台检查实例所属安全组的入方向规则是否允许来自0.0.0.0/0或你指定IP段的443端口TCP流量。检查域名解析在本地电脑ping gmtest.example.com看是否解析到了正确的服务器公网IP。问题3浏览器提示“不安全”、“证书无效”或“证书不匹配”原因证书链不完整或域名不匹配。排查证书链完整.pem文件应该包含站点证书和中间CA证书通常还有根证书。你可以用文本编辑器打开.pem文件应该看到多个-----BEGIN CERTIFICATE-----块。阿里云下载的Nginx证书包通常已包含完整链。域名匹配确认浏览器访问的域名包括www前缀完全包含在证书的“使用者可选名称SAN”中。对于通配符证书*.example.com它不匹配example.com。浏览器兼容性用Chrome访问国密单证书网站肯定会报错因为Chrome不支持SM2。请使用360安全浏览器需切换到“极速模式”并开启国密支持或密信浏览器测试。这是预期行为不是配置错误。问题4国密浏览器访问仍无法建立国密连接原因Nginx配置的密码套件顺序或国密模块未生效。排查密码套件顺序确保ssl_ciphers中ECC-SM4-SM3排在前面。可以尝试更激进的配置只提供国密套件来测试ssl_ciphers ECC-SM4-SM3;。验证Nginx国密模块执行/usr/local/nginx/sbin/nginx -V 21 | grep -i sm看输出中是否包含--with-openssl指向国密模块的路径。也可以查看Nginx错误日志cat /usr/local/nginx/logs/error.log看SSL握手时是否有相关国密算法的日志。检查证书类型确认你部署的确实是国密证书SM2而不是误用了RSA证书。问题5如何更新或替换证书证书快过期时你需要用新证书替换旧文件。备份旧证书文件。在阿里云控制台申请证书续费或重新购买下载新的证书包。将新的.pem和.key文件上传到服务器覆盖旧文件确保文件名一致。执行sudo /usr/local/nginx/sbin/nginx -t测试配置。执行sudo /usr/local/nginx/sbin/nginx -s reload平滑重载。无需重启Nginx服务不会中断。5.3 高级配置与优化建议启用HTTP/2在listen 443 ssl;后面加上http2即listen 443 ssl http2;可以显著提升HTTPS网站性能。但需确认编译Nginx时包含了--with-http_v2_module默认通常已包含。OCSP装订提高证书验证速度。需要在Nginx配置中指定OCSP响应文件这需要证书颁发机构支持。沃通国密证书支持OCSP但配置稍复杂需使用ssl_stapling on;等指令。会话恢复配置ssl_session_cache和ssl_session_timeout可以减少SSL握手开销提升性能。上面的配置示例已经包含。HSTS添加HTTP严格传输安全头强制浏览器使用HTTPS。在server块中添加add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload;。注意一旦启用在max-age时间内浏览器将强制使用HTTPS请谨慎评估。部署国密SSL证书是一个涉及密码学、Web服务器和网络知识的综合性任务。整个过程最关键的环节在于国密Nginx的编译和双证书的配置。编译失败时耐心查看日志、修改路径配置完成后务必进行多维度验证。当你在国密浏览器中看到那个代表国密算法的安全锁时所有的折腾都是值得的。这不仅意味着项目满足了合规要求也标志着你在国产化技术栈的实践上迈出了扎实的一步。如果在操作中遇到其他古怪问题不妨多检查一下文件权限、路径和防火墙这三个地方往往是问题的藏身之处。