Apache 官方版本不支持国密算法。要在Apache上部署国密,核心思路是使用支持国密的OpenSSL替代版本来重新编译Apache和`mod_ssl`模块。
一、编译步骤(以GMSSL为例)
以下步骤以在CentOS 7环境下编译Apache 2.4.46与GMSSL为例。
1. 安装编译工具及依赖
首先,安装必要的开发工具和依赖包。
```bash
yum install -y gcc gcc-c++ wget make perl pcre-devel expat-devel bison bison-devel flex flex-devel
```
2. 获取并安装国密版OpenSSL (GMSSL)
从GMSSL官网下载`gmssl_openssl_1.1_bx.tar.gz`。
解压到`/usr/local/`目录。
```bash
tar xzfm gmssl_openssl_1.1_bx.tar.gz -C /usr/local
```
* 此时,国密版OpenSSL的路径为 `/usr/local/gmssl`。
3. 获取并编译APR和APR-Util
Apache Portable Runtime (APR) 是Apache的必要组件,需要先编译。
编译APR:
```bash
wget https://mirror.bit.edu.cn/apache//apr/apr-1.7.0.tar.gz
tar zxfm apr-1.7.0.tar.gz
cd apr-1.7.0
./configure --prefix=/usr/local/apr
make && make install
```
编译APR-Util:
```bash
wget https://mirrors.bfsu.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
tar zxfm 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
```
4. 获取并编译Apache (httpd)
* 下载Apache源码:
```bash
wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.46.tar.gz
tar zxfm httpd-2.4.46.tar.gz
cd httpd-2.4.46
```
配置(最关键一步): 执行`configure`脚本,关键是通过`--with-ssl=/usr/local/gmssl`指定使用国密版OpenSSL。
```bash
./configure \
--prefix=/usr/local/httpd \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork \
--with-zlib \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--with-ssl=/usr/local/gmssl \
LDFLAGS=-lm
```
修改链接方式(重要): 为了让`mod_ssl`静态链接国密库,需要编辑配置文件。
```bash
vi build/config_vars.mk
```
找到 `ab_LIBS` 行,将其中的 `-L/usr/local/gmssl/lib -lssl -lcrypto` 替换为 `/usr/local/gmssl/lib/libssl.a /usr/local/gmssl/lib/libcrypto.a`。
编译与安装:
```bash
make && make install
```
安装完成后,支持国密的Apache位于 `/usr/local/httpd`。
二、启用与配置
1. 加载`mod_ssl`模块:在`/usr/local/httpd/conf/httpd.conf`中,确保以下行未被注释:
```apache
LoadModule ssl_module modules/mod_ssl.so
```
2. 配置国密证书与套件:编辑`/usr/local/httpd/conf/extra/httpd-ssl.conf`(或`httpd.conf`),在对应的`<VirtualHost>`中添加国密证书和密码套件。
```apache
<VirtualHost *:443>
# ... 其他配置 ...
SSLCertificateFile /path/to/your_sm2_cert.pem
SSLCertificateKeyFile /path/to/your_sm2_key.pem
# 启用国密协议和套件(具体名称可能因GMSSL版本而异)
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-SM2-SM4-SM3:SM2-SM4-SM3
SSLHonorCipherOrder on
</VirtualHost>
```
三、验证
检查模块: 执行 `/usr/local/httpd/bin/httpd -M | grep ssl`,若输出包含 `ssl_module (shared)` 则表示成功。
检查端口: 确保服务器443端口已开放。
四、补充说明
双证书部署:为兼顾浏览器兼容性,可部署SM2/RSA双证书。主流云服务商(如阿里云、腾讯云)的文档提供了详细指导。
其他国密方案:除GMSSL外,也可选择沃通 (Wosign) 的`wotrus_ssl`模块或铜锁 (Tongsuo) 等方案。