官方版 Apache 搭配官方版 OpenSSL 确实无法直接支持国密算法。核心原因是 Apache 的 `mod_ssl` 模块依赖 OpenSSL 提供加密能力,而官方 OpenSSL 过去默认不包含国密算法实现。
要解决这个问题,主要有以下几种方案:
一、方案一:替换为国密增强版OpenSSL(最推荐)
这是最核心、最彻底的解决方案:将系统或Apache依赖的OpenSSL,替换为支持国密算法的增强版本,并重新编译Apache以链接新的OpenSSL库。
目前主流的国密增强版OpenSSL分支有:
名称 简介与特点 注意事项
GmSSL 由北京大学信息安全实验室开发维护,是国内最早、最知名的OpenSSL国密分支。支持SM2/SM3/SM4等算法,并与OpenSSL保持API兼容。 社区版已停止维护 ,生产环境需谨慎评估。
TASSL 由江南天安基于OpenSSL 1.1.1s修改,支持国密SSL协议和TLS 1.3国密套件。与原生Nginx和Apache兼容性较好。 属于特定厂商的发行版,需关注其更新策略。
铜锁/Tongsuo 阿里云等发起的开源项目,提供国密算法支持,常与Tengine配合使用。 可关注其社区活跃度和文档完善度。
二、操作步骤简述:
1. 下载源码:从GmSSL、TASSL等项目的官方仓库下载国密版OpenSSL源码。
2. 编译安装:在服务器上编译并安装该国密版OpenSSL,注意安装路径(例如 `/usr/local/gmssl`)。
3. 获取Apache源码:下载官方Apache HTTP Server源码。
4. 重新编译Apache:在编译Apache时,通过参数明确指定链接到新编译的国密版OpenSSL库,而不是系统默认版本。
5. 配置与启用:在Apache的SSL配置文件中,设置`SSLCipherSuite`指令以启用国密套件。
三、方案二:使用OpenSSL 3.0及以上版本(更现代的方式)
从OpenSSL 3.0开始,通过其模块化的Provider(提供者) 机制,可以更灵活地加载算法。
原理:OpenSSL 3.0本身可以通过加载特定的Provider来支持国密算法。虽然默认的Provider可能不包含,但可以寻找或开发专门的国密Provider。
注意:此方案依赖于是否存在一个稳定、可用的国密Provider。在实施前,需要确认是否有符合你需求的Provider。
四、方案三:使用国密引擎(Engine)
OpenSSL的Engine机制允许动态加载第三方加密模块。
原理:可以使用诸如 `gmssl-engine` 之类的项目,或通过 `openssl-pkcs11` 等插件间接提供支持。
注意:Engine是一种相对较老的技术,在OpenSSL 3.0中已被Provider机制取代。此方案的稳定性和性能可能不如前两种方案。
五、方案四:使用商业或信创Linux发行版
最省心的方式是直接使用已集成了国密支持的操作系统。
原理:许多面向信创市场的Linux发行版,如华为OpenEuler,其软件仓库中已包含打了国密补丁的OpenSSL包(如 `openssl-gm`)。
做法:只需通过系统的包管理器(如 `yum` 或 `apt`)直接安装这些打了补丁的包即可,无需手动编译。
六、方案五:双证书方案(兼顾兼容性)
为了同时兼容国密浏览器(如密信、红莲花)和普通浏览器(如Chrome),通常会采用双证书方案。
原理:在服务器上同时配置SM2(国密)证书和RSA(国际)证书。
实现:服务器根据客户端是否支持国密算法,自动选择相应的证书进行SSL握手。这通常需要对服务器进行更复杂的配置,或使用支持该功能的特定软件(如Tengine)。
重要注意事项
证书获取:实施改造前,你需要先从支持国密算法的CA机构申请并获取国密标准的SSL证书。
彻底替换:如果选择方案一,请务必确保Apache在编译和运行时都链接到了正确的国密版OpenSSL库,避免因链接错误导致失败。
配置正确性:国密套件的名称(如 `ECDHE-SM2-SM4-SM3`)可能因不同的OpenSSL分支而异,配置时需参考具体项目的文档。
总结
最推荐方案是“替换为国密增强版OpenSSL(方案一)”,这是最直接、可控且被广泛验证的路径,尤其是使用 GmSSL 或 TASSL 等成熟分支。
如果追求更低的管理成本和更“开箱即用”的体验,可以考虑直接选用已集成国密支持的信创操作系统(方案四)。