要让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版本,我再帮你进一步分析。