在Linux系统的Apache服务器上部署国密SSL证书,关键前提是官方版Apache+OpenSSL并不原生支持国密算法。
因此,完整的部署流程大致分为:重新编译支持国密的Apache环境,然后配置证书。
下面是基于主流云服务商文档整理的详细步骤,供你参考。
一、准备工作:确认前提条件
动手前,请先确认以下条件已满足:
证书与域名:已通过权威CA机构购买了状态为“已签发”的国密标准(SM2)SSL证书。同时,确保域名已正确解析到服务器IP,且已完成ICP备案(国内服务器必须)。
服务器权限:拥有服务器的root或具备sudo权限的账号。
网络与端口:确保服务器上的 443端口 已开放,并且在云服务商的安全组策略中也放行了该端口。
远程工具:准备好SSH远程登录工具(如PuTTY、Xshell)和文件传输工具(如WinSCP)。
第一步:编译支持国密的Apache环境(核心步骤)
这是最关键的一步,需要重新编译Apache,使其链接到国密版的OpenSSL(如`gmssl_openssl`)。
1. 安装编译依赖:通过SSH登录服务器,安装编译所需的开发工具和库。
bash
yum install -y gcc gcc-c++ wget make perl pcre-devel expat-devel bison bison-devel flex flex-devel
2. 下载并编译国密版OpenSSL(GMSSL):
从国密SSL实验室(GMSSL)官网下载适合你系统的`gmssl_openssl`包。
将下载的文件解压到指定目录,例如 `/usr/local/gmssl`。
bash
# 示例:假设下载的文件为 gmssl_openssl_1.1_b2024_x64_1.tar.gz
tar xzfm gmssl_openssl_1.1_b2024_x64_1.tar.gz -C /usr/local
3. 下载并编译Apache及其依赖(apr和apr-util):
下载并编译安装`apr`和`apr-util`。
下载Apache源码(推荐2.4.46或2.4.62版本)。
关键配置:在`./configure`步骤中,通过`--with-ssl=/usr/local/gmssl`参数,指定Apache使用国密版OpenSSL进行编译。
bash
# 1. 下载并编译 apr (示例)
cd /usr/local
wget https://archive.apache.org/dist/apr/apr-1.7.5.tar.gz
tar -zvxf apr-1.7.5.tar.gz
cd apr-1.7.5
./configure --prefix=/usr/local/apr
make && make install
# 2. 下载并编译 apr-util (示例)
cd /usr/local
wget http://archive.apache.org/dist/apr/apr-util-1.6.1.tar.gz
tar -zvxf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
# 3. 下载、配置并编译 Apache (示例)
cd /usr/local
wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz
tar -zvxf httpd-2.4.46.tar.gz
cd httpd-2.4.46
./configure --prefix=/usr/local/httpd \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--with-ssl=/usr/local/gmssl # <--- 关键参数
make && make install
注意:编译完成后,新Apache的安装目录在 `/usr/local/httpd`。
第二步:准备证书文件
1. 下载证书:从你的SSL证书管理后台,下载专用于Apache或PEM格式的证书文件包。
2. 上传文件:解压后,你通常会得到以下文件。将它们上传到Apache服务器的一个安全目录,如 `/usr/local/httpd/conf/ssl/`。
证书文件:通常是`.crt`或`.pem`结尾,也可能包含一个证书链文件(如`fullchain.pem`或`chain.crt`)。
私钥文件:`.key`结尾,务必妥善保管。
第三步:配置Apache
1. 开启SSL模块:编辑Apache的主配置文件 `conf/httpd.conf`,确保以下两行没有被注释掉(去掉行首的`#`)。
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
2. 配置虚拟主机:编辑SSL配置文件 `conf/extra/httpd-ssl.conf`(或你站点的虚拟主机配置文件),在`<VirtualHost _default_:443>`段落内,添加或修改以下指令:
<VirtualHost _default_:443>
# 你的域名
ServerName www.yourdomain.com
# 国密证书文件路径
SSLCertificateFile "/usr/local/httpd/conf/ssl/your_certificate.crt"
# 国密证书私钥文件路径
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/your_private.key"
# 如果证书压缩包中有证书链文件,取消下面注释并配置
# SSLCertificateChainFile "/usr/local/httpd/conf/ssl/your_chain.crt"
# 其他配置...
</VirtualHost>
第四步(可选):部署SM2/RSA双证书以实现最佳兼容
由于国密证书仅被少数国产浏览器原生支持,为了兼容所有浏览器(如Chrome、Firefox),最佳实践是部署SM2/RSA双证书。
这需要在同一端口(443)同时配置两套证书,并利用 ALPN(应用层协议协商) 扩展,让服务器根据客户端是否支持国密协议(`sm2-http/1.1`)来返回对应的证书。
实现方式通常需要借助一个支持ALPN协商的模块或特定配置,具体方法可能因Apache版本和国密支持库而异,需要参考你所使用的国密SSL厂商提供的详细双证书部署文档。
第五步:验证部署结果
配置完成后,执行以下操作验证:
1. 检查配置:运行以下命令检查Apache配置文件语法是否正确。
bash
/usr/local/httpd/bin/apachectl configtest
如果看到 `Syntax OK`,则配置无误。
2. 重启Apache:
bash
/usr/local/httpd/bin/apachectl restart
3. 访问验证:
在支持国密的浏览器(如360安全浏览器、红莲花浏览器)中,用 `https://你的域名` 访问,应显示安全锁标志。
在Chrome或Firefox中访问,如果你只配置了国密证书,浏览器会报安全警告;如果配置了双证书,则应能正常访问。
你目前是在测试环境还是生产环境部署呢?如果是在测试环境,可以考虑先部署单张国密证书验证流程;如果是生产环境,为了兼顾各类浏览器的访问,建议直接按双证书方案来部署。需要我针对双证书方案展开讲讲具体配置可以随时聊。