在Apache环境下配置SM2+RSA双证书,核心思路是部署支持国密算法的Apache版本,并通过ALPN(应用层协议协商)扩展实现证书的自动切换。

由于官方Apache和OpenSSL默认不支持国密算法,需要重新编译安装。以下是基于主流方案(如沃通国密模块)的详细步骤,供你参考。

一、准备工作

在开始配置前,请确保你已具备以下条件:

  证书文件:已获取由权威CA签发的RSA证书和SM2双证书(包含签名证书、加密证书及对应的私钥)。

  服务器环境:拥有Linux服务器的`root`权限,并已确保域名解析指向服务器。

  网络环境:服务器防火墙已开放`443`端口。

步骤一:安装国密版Apache

你需要从源码编译安装一个支持国密算法的Apache。以下以沃通(Wosign)国密模块为例。

1.    安装编译依赖

        ```bash

        yum  install  -y  gcc  gcc-c++  make  pcre-devel  expat-devel  apr  apr-util  bison  bison-devel  flex  flex-devel

        ```

2.    编译安装国密版OpenSSL  (GMSSL)

        从国密SSL官方或相关服务商(如沃通)获取国密版OpenSSL源码包。

        ```bash

        #  假设已下载  gmssl_openssl_1.1_b2024_x64_1.tar.gz  到/root目录

        tar  xzfm  /root/gmssl_openssl_1.1_b2024_x64_1.tar.gz  -C  /usr/local

        #  此时  /usr/local/gmssl  即为国密版openssl目录

        ```

3.    编译安装支持国密的Apache

        下载Apache源码包(如`httpd-2.4.46.tar.gz`),在配置时指定使用国密版OpenSSL。

        ```bash

        tar  zxfm  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-mpm=prefork  \

                --with-ssl=/usr/local/gmssl  \  #  关键:指定国密OpenSSL路径

                --with-zlib  \

                LDFLAGS=-lm

        make  &&  make  install

        ```

步骤二:配置双证书

在Apache的SSL配置文件中(通常是`/usr/local/httpd/conf/extra/httpd-ssl.conf`或`conf.d/ssl.conf`),你需要同时配置RSA证书和SM2双证书。

1.    配置RSA证书

        使用标准的Apache  SSL指令。

        ```apache

        SSLCertificateFile  "/path/to/your/rsa_cert.pem"

        SSLCertificateKeyFile  "/path/to/your/rsa_private.key"

        SSLCertificateChainFile  "/path/to/your/rsa_chain.crt"  #  如果CA提供了链证书

        ```

2.    配置SM2双证书

        国密SM2证书体系包含签名证书和加密证书,需使用特定指令(如沃通模块的`WotrusSSLCertificateFile`等)分别指定。

        ```apache

        #  SM2签名证书及私钥

        WotrusSSLCertificateFile  "/path/to/your/domain_sm2_sign.pem"

        WotrusSSLCertificateKeyFile  "/path/to/your/domain_sm2_sign.key"

        #  SM2加密证书及私钥

        WotrusSSLCertificateEncFile  "/path/to/your/domain_sm2_enc.pem"

        WotrusSSLCertificateEncKeyFile  "/path/to/your/domain_sm2_enc.key"

        ```

        注意:具体的SM2证书配置指令可能因你使用的国密模块而异,请以你所选模块的官方文档为准。

步骤三:启用ALPN协议协商

为实现客户端自动选择证书,需要在Apache配置中启用ALPN扩展。

```apache

#  在SSL  VirtualHost配置中启用ALPN

  Protocols  http/1.1  sm2-http/1.1

```

此配置告知支持国密的客户端(如密信浏览器),在TLS握手时可通过ALPN声明支持`sm2-http/1.1`协议,服务器便会自动匹配并返回SM2证书。

步骤四:验证配置

1.    检查配置文件语法

        ```bash

        /usr/local/httpd/bin/apachectl  -t

        ```

2.    重启Apache服务:

        ```bash

        /usr/local/httpd/bin/apachectl  restart

        ```

3.    测试访问:

          使用Chrome等主流浏览器访问,应能正常加载RSA证书。

          使用密信、红莲花等国密浏览器**访问,应能正常加载SM2证书。

二、重要提醒

  浏览器兼容性:SM2证书目前仅被少数国产浏览器原生支持。双证书方案正是为了解决此问题,让普通浏览器使用RSA证书,国密浏览器使用SM2证书。

  模块差异:不同厂商(如沃通、零信等)提供的国密Apache模块,其配置指令和细节可能有所不同。请务必以你实际使用的模块官方文档为准。

  排查思路:若配置后访问异常,请重点检查Apache错误日志(`error_log`),确认国密模块是否已正确加载,以及证书文件路径和权限是否正确。