要让Apache支持国密双证书,核心在于必须使用集成了国密算法(SM2/SM3/SM4)的专用Apache版本。官方版本和通用OpenSSL库是不支持国密协议的。
配置时,分别加载签名证书和加密证书的指令如下:
指令 用途
`SSLCertificateFile` 指定签名证书的路径
`SSLCertificateKeyFile` 指定签名证书对应的私钥文件路径
`SSLCertificateEncryptFile` 指定加密证书的路径
`SSLCertificateEncryptKeyFile` 指定加密证书对应的私钥文件路径
注意:以上指令是否可用,完全取决于你所使用的国密版Apache。部分版本(如阿里云部署方案)也可能使用 `SSLCertificateChainFile` 来加载加密证书的私钥。
配置步骤详解
1. 环境准备
必须准备一个集成了国密算法的Apache环境,例如使用Tongsuo定制版或阿里云集成了Wosign国密模块的版本。
2. 上传证书和私钥
将证书文件(.crt)和私钥文件(.key)上传到服务器安全目录,如 `/etc/httpd/ssl`,并确保它们的安全权限。
3. 编辑Apache配置文件
通常编辑 `/etc/httpd/conf/httpd.conf` 或 `/etc/httpd/conf/extra/httpd-ssl.conf` 文件。一个典型的国密双证书虚拟主机配置示例如下:
apache
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot "/var/www/html"
# 开启SSL引擎
SSLEngine on
# 加载签名证书和私钥
SSLCertificateFile /etc/httpd/ssl/server_sign.crt
SSLCertificateKeyFile /etc/httpd/ssl/server_sign.key
# 加载加密证书和私钥
SSLCertificateEncryptFile /etc/httpd/ssl/server_encrypt.crt
SSLCertificateEncryptKeyFile /etc/httpd/ssl/server_encrypt.key
# 配置国密加密套件
SSLCipherSuite ECDHE-SM2-WITH-SM4-GCM-SM3:ECDHE-SM2-WITH-SM4-CBC-SM3
# 强制服务器优先选择国密套件
SSLHonorCipherOrder on
# 其他SSL协议配置
SSLProtocol all -SSLv2 -SSLv3
</VirtualHost>
4. 关键配置解读
`<VirtualHost *:443>`:定义监听443端口的虚拟主机。
`SSLEngine on`:开启SSL/TLS加密功能。
签名/加密证书:分别用`SSLCertificateFile`和`SSLCertificateEncryptFile`加载对应的证书文件。
`SSLCipherSuite`:限制服务器使用的加密套件。国密环境通常配置以`ECDHE-SM2`等开头的国密套件。
`SSLHonorCipherOrder`:设为`on`确保服务器优先选择国密套件。
5. 重启并验证
配置完成后,使用以下命令检查配置并重启Apache:
bash
apachectl configtest # 检查配置文件语法
systemctl restart httpd # 重启服务
最后,可使用支持国密算法的浏览器(如密信浏览器)访问网站,或使用国密版OpenSSL命令行工具连接,以验证国密双证书是否生效。
常见问题与注意事项
非国密客户端(如Chrome)如何访问?
可以配置SM2/RSA双证书方案,让Apach根据客户端请求自动选择证书。但官方Apache不支持,需要复杂的配置(如SNI多域名)。更成熟的方案是使用支持双证书签发的CA机构+支持双证书的负载均衡/代理软件(如Nginx),根据客户端支持的算法动态返回合适的证书。
Apache本身支持动态选择双证书吗?
官方Apache无法实现,它只能发送你在`SSLCertificateFile`里指定的那一个证书,无法根据客户端情况自动切换。这通常需要借助Nginx等更现代的反向代理来实现。
找不到`SSLCertificateEncryptFile`怎么办?
这是关键。如果报错,说明你的Apache版本并非国密专用版。**在这种情况下,请停止配置,先重新安装或编译集成了国密补丁的Apache版本**,否则后续所有步骤都无法进行。
如果你需要更具体的帮助(如排查证书加载失败的细节),可以告诉我Apache和OpenSSL版本,我再帮你进一步分析。