阿里云SM2国密SSL证书申请与Apache部署实战指南

📅 2026/7/26 4:20:58
阿里云SM2国密SSL证书申请与Apache部署实战指南
1. 项目概述为什么需要关注SM2国密SSL证书最近在给一个对数据安全有严格合规要求的项目做技术支撑客户明确要求必须使用国密算法来构建HTTPS加密通道。这让我把目光投向了阿里云的SM2国密SSL证书服务。对于很多习惯了RSA/ECC证书的开发者来说国密SSL可能还是个新领域但在金融、政务、央企等特定行业这已经是硬性要求了。简单来说这不仅仅是换一个加密算法而是涉及到从证书申请、到服务器配置、再到浏览器适配的一整套技术栈切换。你可能听说过SSL证书是HTTPS的“身份证”而SM2算法则是我们国家自主设计的一套非对称加密算法标准在安全强度和性能上相比传统的RSA都有其优势。这次实战的目标很明确在阿里云上成功申请一张SM2 SSL证书并将其部署到最常见的ApacheWeb服务器上让我们的网站用上“国密HTTPS”。整个过程会涉及到阿里云控制台的操作、证书文件的处理、Apache的编译与配置等多个环节我会把每一步的原理、操作和踩过的坑都详细记录下来。2. 核心概念与准备工作解析2.1 SM2国密算法与国密SSL证书在动手之前我们必须先搞清楚几个核心概念否则后面的配置就像在迷雾中行走。首先SM2是什么它是一套基于椭圆曲线密码ECC的公钥密码算法标准包含了数字签名、密钥交换和公钥加密。在SSL/TLS场景中我们主要用到它的密钥交换和签名功能。与目前主流的RSA 2048位相比SM2采用256位的椭圆曲线其安全强度相当于RSA 3072位但计算速度更快证书体积更小。这是技术选型的根本原因。那么国密SSL证书又有什么不同它不仅仅是把证书内部的公钥换成了SM2公钥。实际上它遵循的是一套被称为“国密双证书”的体系。这套体系包含两张证书签名证书用于证明服务器身份进行数字签名。其密钥对用于TLS握手时的签名操作。加密证书用于密钥交换其公钥被客户端用来加密预主密钥。其密钥对专门用于加密解密。这与国际标准的RSA/ECC单证书体系一个证书既用于签名也用于加密有显著区别。因此支持国密的Web服务器如经过改造的Nginx、Apache和浏览器如密信浏览器、360安全浏览器国密版都需要能够理解并处理这两张证书。2.2 环境与工具准备工欲善其事必先利其器。开始之前请确保你拥有以下资源阿里云账号与域名你需要一个已在阿里云完成实名认证的账号以及一个你拥有管理权限的域名例如yourdomain.com。证书将绑定到这个域名。云服务器ECS一台安装有Linux系统如CentOS 7/8或Ubuntu 20.04/22.04的阿里云ECS实例。这是我们将要部署Apache的战场。建议选择至少1核2G的配置。基础软件确保服务器上已安装基础的编译工具和依赖。可以通过以下命令安装以CentOS为例yum groupinstall -y Development Tools yum install -y wget openssl openssl-devel pcre pcre-devel zlib zlib-devel支持国密的Apache源码标准的Apache不支持国密双证书。我们需要使用集成了国密算法的特定版本。这里我选择的是Tongsuo铜锁原名BabaSSL及其提供的Apache补丁。Tongsuo是OpenSSL的一个分支对国密算法和协议有很好的支持。注意由于合规性和技术生态原因国密部署的软硬件环境需要提前规划。如果你的业务面向公众互联网还需要考虑客户端浏览器的兼容性问题。目前主流的Chrome、Firefox等尚未原生支持国密通常需要用户安装支持国密的浏览器或根证书。3. 阿里云SM2国密SSL证书申请全流程申请环节主要在阿里云控制台完成步骤清晰但有些细节需要注意。3.1 在阿里云证书服务中创建申请登录阿里云控制台搜索并进入“数字证书管理服务”原SSL证书服务。购买证书在“SSL证书”页面点击“购买证书”。在证书产品页面你需要筛选出支持**国密算法SM2**的证书。阿里云通常将其作为独立产品线列出可能标注为“国密SSL证书”或“SM2 SSL证书”。选择适合你域名类型的选项如单域名、通配符并完成支付。目前也有提供试用期的国密证书可供测试。证书申请购买后在“我的证书”列表中找到对应的证书订单点击“申请”。填写信息域名输入你要绑定的完整域名例如www.yourdomain.com或yourdomain.com。注意国密证书对域名的验证要求与国际证书一致。个人信息准确填写公司名称、部门等信息这些信息会体现在证书的Subject字段中。证书类型关键步骤。在“密钥算法”或类似选项中务必选择“SM2”。在“证书类型”中选择“双证书”。这是国密体系的核心。CSR生成方式建议选择“系统生成”。阿里云会自动为你生成SM2密钥对和证书签名请求CSR这避免了本地生成CSR时可能遇到的格式兼容性问题。如果你选择“手动生成”则需要使用支持SM2的openssl命令如Tongsuo的openssl生成CSR并上传对新手不友好。域名验证提交申请后需要进行域名所有权验证。阿里云会提供一条特殊的DNS解析记录通常是_dnsauth开头的TXT记录。你需要登录你的域名DNS管理后台可能在阿里云云解析也可能在其他注册商处严格按照提供的记录类型、主机记录和记录值添加一条TXT解析记录。实操心得添加DNS记录后验证生效可能需要几分钟到几小时。可以使用dig或nslookup命令来查询TXT记录是否已全球生效例如dig TXT _dnsauth.www.yourdomain.com。在控制台点击“验证”按钮前最好先确认命令查询返回了正确的值否则可能验证失败耽误时间。3.2 证书签发与文件获取域名验证通过后证书机构CA会进行审核并签发证书。这个过程通常很快DV证书几分钟内即可完成。证书签发后你可以在阿里云控制台下载证书文件。国密双证书的下载包通常会包含以下关键文件务必弄清楚每个文件的用途yourdomain.com.sm2.sign.crt-签名证书文件yourdomain.com.sm2.sign.key-签名证书私钥文件yourdomain.com.sm2.encrypt.crt-加密证书文件yourdomain.com.sm2.encrypt.key-加密证书私钥文件chain.crt或类似名称 -证书链文件可能包含中间CA和根CA证书重要提示私钥文件.key是最高机密一旦泄露等同于服务器身份被盗用。下载后请立即通过SFTP等安全方式上传到服务器上的安全目录如/etc/ssl/private/并设置严格的权限例如chmod 600 *.key。切勿通过邮件、网盘等不安全渠道传输。4. 构建支持国密的Apache服务器标准的Apachehttpd配合系统自带的OpenSSL是不支持国密双证书的。我们必须手动编译一个集成了国密算法的Apache。4.1 编译安装Tongsuo国密算法库Tongsuo是我们的国密基础库。我们首先安装它。# 1. 进入源码目录下载Tongsuo源码 cd /usr/local/src wget https://github.com/Tongsuo-Project/Tongsuo/archive/refs/tags/8.3.0.tar.gz -O Tongsuo-8.3.0.tar.gz tar -zxvf Tongsuo-8.3.0.tar.gz cd Tongsuo-8.3.0 # 2. 编译安装Tongsuo # 这里我们将其安装到 /usr/local/tongsuo 目录避免覆盖系统自带的OpenSSL ./config --prefix/usr/local/tongsuo --openssldir/usr/local/tongsuo/ssl enable-ntls make -j$(nproc) # 使用多核编译加速 make install # 3. 设置动态链接库路径让系统能找到Tongsuo echo /usr/local/tongsuo/lib64 /etc/ld.so.conf.d/tongsuo.conf ldconfig # 4. 验证安装 /usr/local/tongsuo/bin/openssl version # 你应该看到输出包含“Tongsuo”字样参数enable-ntls是启用国密传输层安全协议这是国密SSL/TLS的协议标准。编译过程可能需要一些时间。4.2 编译安装支持国密的Apache HTTPD接下来我们需要下载Apache源码并应用Tongsuo提供的补丁然后编译。# 1. 下载Apache httpd源码 cd /usr/local/src wget https://downloads.apache.org/httpd/httpd-2.4.58.tar.gz tar -zxvf httpd-2.4.58.tar.gz cd httpd-2.4.58 # 2. 下载并应用Tongsuo的Apache补丁 # 补丁通常位于Tongsuo源码的patches目录下 cp /usr/local/src/Tongsuo-8.3.0/patches/httpd-2.4.x_ntls.patch . patch -p1 httpd-2.4.x_ntls.patch # 如果提示“patching file ...”通常表示成功。如果大量失败请检查Apache和补丁版本是否匹配。 # 3. 安装编译依赖 yum install -y expat-devel apr-devel apr-util-devel # CentOS # apt install -y libexpat1-dev libapr1-dev libaprutil1-dev # Ubuntu # 4. 配置编译参数关键是指定使用我们刚安装的Tongsuo ./configure --prefix/usr/local/apache \ --with-ssl/usr/local/tongsuo \ --enable-ssl \ --enable-so \ --enable-ntlsshared \ # 启用国密NTLS模块 --with-mpmevent # 5. 编译并安装 make -j$(nproc) make install关键点解析--with-ssl/usr/local/tongsuo这是最关键的参数告诉Apache使用支持国密的Tongsuo库而不是系统自带的OpenSSL。--enable-ntlsshared将国密NTLS模块编译为动态共享模块mod_ntls.so方便管理。--with-mpmevent选择Event MPM这是一种高性能的多处理模块适合高并发场景。编译安装完成后Apache的主程序将安装在/usr/local/apache/bin/httpd配置文件在/usr/local/apache/conf/httpd.conf。5. Apache国密SSL证书配置实战证书和服务器都准备好了现在进入最核心的配置环节。5.1 证书文件整理与放置首先将之前从阿里云下载的证书文件上传到服务器的一个安全目录例如/usr/local/apache/conf/ssl/。建议按如下方式组织/usr/local/apache/conf/ssl/ ├── yourdomain.com.sm2.sign.crt ├── yourdomain.com.sm2.sign.key ├── yourdomain.com.sm2.encrypt.crt ├── yourdomain.com.sm2.encrypt.key └── chain.crt确保私钥文件权限为600chmod 600 /usr/local/apache/conf/ssl/*.key5.2 配置HTTPD虚拟主机启用国密HTTPS编辑Apache主配置文件/usr/local/apache/conf/httpd.conf确保以下模块被加载取消注释或添加LoadModule ssl_module modules/mod_ssl.so LoadModule ntls_module modules/mod_ntls.so # 国密NTLS模块 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so然后在配置文件末尾或创建一个独立的虚拟主机配置文件如conf/extra/httpd-vhosts.conf并Include进来添加以下配置Listen 443 Listen 8443 # 可以为一个新端口用于国密SSL也可以复用443但用不同协议区分 VirtualHost *:443 ServerName www.yourdomain.com DocumentRoot /usr/local/apache/htdocs # 国际标准SSL配置 (RSA/ECC) SSLEngine on SSLCertificateFile /usr/local/apache/conf/ssl/yourdomain.com.rsa.crt # 你的国际证书 SSLCertificateKeyFile /usr/local/apache/conf/ssl/yourdomain.com.rsa.key SSLCertificateChainFile /usr/local/apache/conf/ssl/chain_rsa.crt /VirtualHost VirtualHost *:8443 ServerName www.yourdomain.com DocumentRoot /usr/local/apache/htdocs # 国密NTLS配置 NTLSEnable on # 指定签名证书和私钥 NTLSCertificateFile /usr/local/apache/conf/ssl/yourdomain.com.sm2.sign.crt NTLSCertificateKeyFile /usr/local/apache/conf/ssl/yourdomain.com.sm2.sign.key # 指定加密证书和私钥 NTLSCertificateEncryptFile /usr/local/apache/conf/ssl/yourdomain.com.sm2.encrypt.crt NTLSCertificateEncryptKeyFile /usr/local/apache/conf/ssl/yourdomain.com.sm2.encrypt.key # 指定证书链文件签名证书链 NTLSCertificateChainFile /usr/local/apache/conf/ssl/chain.crt # 密码套件配置优先使用国密套件 NTLSCipherSuite ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3 # 协议版本 NTLSTLSProtocol all /VirtualHost配置深度解析双监听端口示例中443端口用于传统的国际SSL8443端口用于国密NTLS。在实际生产环境中你可能需要根据网络策略决定是分端口部署还是通过协议探测在同一个端口上同时支持两种协议这需要更复杂的配置或前端代理。指令区别国密配置使用的是NTLS*系列指令与国际SSL的SSL*指令一一对应但前缀不同这是Apachemod_ntls模块的约定。双证书指定NTLSCertificateFile和NTLSCertificateEncryptFile分别指向签名证书和加密证书这是国密双证书体系的关键体现。密码套件NTLSCipherSuite指定了国密算法套件如ECC-SM2-WITH-SM4-SM3其中SM2用于密钥交换和签名SM4用于对称加密SM3用于摘要算法。5.3 启动Apache与防火墙配置配置完成后检查配置文件语法并启动服务/usr/local/apache/bin/apachectl -t # 如果显示“Syntax OK”则配置正确 /usr/local/apache/bin/apachectl start设置防火墙开放相应端口如果使用firewalldfirewall-cmd --permanent --add-servicehttps # 开放443 firewall-cmd --permanent --add-port8443/tcp # 开放8443 firewall-cmd --reload6. 测试、验证与故障排查实录部署完成后验证工作至关重要。6.1 使用OpenSSL/Tongsuo命令行测试使用我们安装的Tongsuo的openssl客户端来测试国密连接# 测试国密NTLS连接 /usr/local/tongsuo/bin/openssl s_client -connect localhost:8443 -ntls -servername www.yourdomain.com # 测试国际SSL连接 /usr/local/tongsuo/bin/openssl s_client -connect localhost:443 -servername www.yourdomain.com在s_client的输出中你需要重点关注SSL handshake has read ... bytes and written ... bytes握手成功。Verify return code: 0 (ok)证书验证成功。在国密测试中应该能看到类似于Protocol : NTLSv1.1和Cipher : ECC-SM2-WITH-SM4-SM3的字样这表明国密协议和算法套件已成功启用。6.2 浏览器访问测试由于主流浏览器尚未原生支持国密你需要使用支持国密的浏览器进行测试在客户端安装密信浏览器或360安全浏览器国密版。在这些浏览器中访问https://www.yourdomain.com:8443。点击地址栏的锁形图标查看证书详情。你应该能看到证书的加密算法是SM2并且证书链完整。常见问题与排查技巧实录Apache启动失败报错“Cannot load modules/mod_ntls.so into server”原因动态库依赖缺失或mod_ntls.so模块未正确编译。排查运行ldd /usr/local/apache/modules/mod_ntls.so检查是否有not found的库通常是Tongsuo的库libssl.so.3,libcrypto.so.3。确保/usr/local/tongsuo/lib64已正确添加到/etc/ld.so.conf.d/并执行了ldconfig。确认编译Apache时--enable-ntlsshared参数已指定且配置过程中没有错误。SSL握手失败客户端报错“no ciphers available”或“wrong version number”原因客户端与服务器支持的协议或密码套件不匹配。排查检查Apache配置中的NTLSCipherSuite或SSLCipherSuite是否正确。国密测试时确保客户端如Tongsuo s_client使用-ntls参数。确认监听端口是否正确。国密服务是否确实运行在配置的端口如8443上使用netstat -tlnp | grep httpd查看。浏览器访问国密端口提示“不安全”或“证书无效”原因国密根证书不在浏览器的信任库中。排查这是正常现象。国密SSL证书的根证书通常不是预置在操作系统或通用浏览器中的。你需要将阿里云国密证书的根证书手动导入到测试浏览器的“受信任的根证书颁发机构”中。从阿里云下载的证书包中通常包含一个root.crt或类似文件这就是根证书。在密信浏览器中通过设置-安全-管理证书导入该根证书到“受信任的根证书颁发机构”存储中。之后刷新页面锁图标应该显示为安全。性能问题启用国密后感觉连接变慢原因SM2算法本身性能优于同等安全强度的RSA但可能是由于双证书体系导致握手过程略有不同或者服务器硬件/配置需要优化。排查确保Apache使用了合适的MPM如Event并优化了KeepAlive、MaxRequestWorkers等参数。使用压测工具如支持国密的ntls-s_client或改造后的JMeter对比单证书RSA和双证书SM2的性能差异。在多数情况下SM2的性能优势会体现出来。整个从申请到部署的过程最关键的其实就是理解“双证书”这个核心差异并在编译和配置环节将对应的国密模块和参数正确引入。一旦走通这个流程你会发现为国密合规而进行的服务端改造其核心逻辑是清晰且可复现的。对于有严格国密合规要求的项目提前在测试环境完成这套实战演练能为生产环境的平滑过渡打下坚实基础。