在 Apache 服务器上配置国密加密套件,核心思路是用支持国密算法的软件(如 `GMSSL`)替换掉 Apache 默认依赖的 `mod_ssl` 和 `OpenSSL`,才能正确使用 `SM2-WITH-SMS4-SM3` 这类加密套件。
一、国密方案核心:替换 OpenSSL
`Apache` 和 `mod_ssl` 模块原生不支持国密算法。需要将其底层依赖的 `OpenSSL` 替换为国密增强版(如 `GMSSL` 或 `Tongsuo`),才能实现国密 `TLS`。安装时,Apache 需要显式链接到这个国密版的 OpenSSL 库。
二、配置步骤
步骤一:编译与安装国密支持的 Apache
1. 安装开发工具:
bash
yum install -y gcc gcc-c++ wget make perl pcre-devel expat-devel bison bison-devel flex flex-devel
2. 下载与编译依赖库 (APR, APR-Util):
按顺序编译安装 `apr` 和 `apr-util`。
bash
# 编译安装 apr (示例版本 1.7.5)
cd /usr/local
wget -c http://mirrors.tencent.com/apache/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
# 编译安装 apr-util
cd /usr/local
wget -c http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
tar -zvxf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
3. 下载并安装国密版 OpenSSL (如 GMSSL):
下载 GMSSL 包,解压以备编译。
bash
# 下载并解压 GMSSL 至 /usr/local,解压后得目录 /usr/local/gmssl
cd /usr/local
wget https://www.gmssl.cn/gmssl/gmssl_openssl_1.1_b1.tar.gz
tar xzfm gmssl_openssl_1.1_b1.tar.gz -C /usr/local
4. 编译 Apache 并链接国密 OpenSSL:
下载官方 Apache 源码,配置时通过 `--with-ssl` 指定国密版 OpenSSL 路径,进行编译与安装。
bash
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 --enable-modules=most --enable-mpms-shared=all \
--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util \
--with-ssl=/usr/local/gmssl # 关键:指向国密版OpenSSL
make && make install
步骤二:配置国密加密套件
1. 准备证书文件:
获取并上传证书与私钥文件(默认路径如 `/etc/httpd/conf.d/ssl/`)。需准备两个版本:
国密证书:`server-sm2.crt` 和 `server-sm2.key`。
RSA证书(可选,推荐):`server-rsa.crt` 和 `server-rsa.key`。
2. 修改 Apache 配置文件:
编辑虚拟主机配置文件(如 `conf/extra/httpd-ssl.conf` 或 `conf.d/ssl.conf`)。下面的示例展示了如何按优先级组合配置两种证书:
apache
# 加载 SSL 模块
LoadModule ssl_module modules/mod_ssl.so
# 监听 443 端口
Listen 443
<VirtualHost *:443>
ServerName your-domain.com
# 推荐:先配置RSA证书,再配置国密证书,以实现自适应算法
SSLCertificateFile /path/to/your-rsa-cert.pem
SSLCertificateKeyFile /path/to/your-rsa-key.pem
# 国密证书配置
SSLCertificateFile /path/to/your-sm2-cert.pem
SSLCertificateKeyFile /path/to/your-sm2-key.pem
# 配置加密套件:此处为关键配置,用于指定国密算法组合
SSLCipherSuite ECDHE-SM2-WITH-SM4-SM3:SM2-WITH-SMS4-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256
# 服务器优先选择套件
SSLHonorCipherOrder on
# 启用 TLS 协议(国密通常基于 TLS 1.1/1.2 扩展)
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
重点解析:
`SSLCipherSuite`:此行是核心,`SM2-WITH-SMS4-SM3 :` 前缀明确指定了优先使用国密套件,其后可配置国际算法作为降级兼容方案。
`SSLHonorCipherOrder on`:强制服务器严格按照 `SSLCipherSuite` 中规定的顺序来选择加密套件。
双证书部署:同时配置国密和 RSA 证书,服务器能根据客户端请求自动选用合适的算法,极大增强兼容性。
3. 重启 Apache 服务:
配置完成后,务必进行语法检查并让新设置生效。
bash
# 检查配置文件语法
/usr/local/httpd/bin/apachectl -t
# 重启服务
systemctl restart httpd
三、验证配置效果
使用支持国密的浏览器(如 360 安全浏览器、红莲花浏览器)访问网站,地址栏应正常显示安全锁标志。
使用 `openssl s_client` 在服务器本地进行验证(如果 `openssl` 命令本身也替换为国密版),确保国密套件被列出且握手成功。
使用专业在线工具(推荐):使用 myssl.com 的国密检测工具进行检测,它能清晰展示服务器是否支持国密套件,是验证的最佳选择。
如果你在具体的编译或配置中遇到问题,可以告诉我你使用的操作系统和 Apache 版本,我来帮你一起看看。