在Apache服务器上部署国密多域名证书,核心思路是使用**虚拟主机(VirtualHost)  为每个域名独立配置,而非在单个配置中列出所有域名。

需要注意,国密证书(SM2算法)的部署不能直接套用RSA证书的流程。Apache默认不支持SM2,需要专门的编译和环境配置。

一、前提准备:支持国密的Apache环境

部署前,必须先准备好一个支持国密算法的Apache环境。主要步骤如下:

1.    获取国密版OpenSSL  (GMSSL):这是支持SM2/SM3/SM4等算法的核心库。

2.    重新编译Apache:在编译Apache时,指定使用国密版OpenSSL(`--with-ssl=/path/to/gmssl`)。

3.    加载必要模块:确保`mod_ssl.so`模块已加载。

4.    确认证书文件:你需要从证书颁发机构获取国密证书,通常包含`_public.crt`(证书)、`_chain.crt`(证书链)和`.key`(私钥)文件。

二、核心配置:虚拟主机与多域名

实现多域名证书部署主要通过两种方式:

方案一:多域名证书(SAN证书)

如果一张证书包含多个域名(例如`www.example.com`和`www.test.com`),只需在一个虚拟主机配置中,通过`ServerName`和`ServerAlias`指令来指定所有域名。

配置示例:

```apache

<VirtualHost  *:443>

        #  指定主域名

        ServerName  www.example.com

        #  用  ServerAlias  列出证书涵盖的其他所有域名

        ServerAlias  www.test.com  example.net


        #  开启SSL并指定国密证书路径

        SSLEngine  on

        SSLCertificateFile  "/etc/ssl/certs/your_domain_public.crt"

        SSLCertificateKeyFile  "/etc/ssl/certs/your_domain.key"

        SSLCertificateChainFile  "/etc/ssl/certs/your_domain_chain.crt"

        #  ...  其他配置

</VirtualHost>

```

>  这种方式证书数量少,管理方便,但需确保`ServerAlias`中的域名都在证书的SAN列表中。

方案二:通配符证书

如果证书是`*.example.com`这样的通配符证书,同样是在一个虚拟主机中,用`ServerName`指定主域即可,它会自动匹配所有一级子域名。

配置示例:

```apache

<VirtualHost  *:443>

        #  指定主域名,如使用通配符证书  *.example.com

        ServerName  www.example.com

        #  可选,指定其他需要匹配的域名

        ServerAlias  *.example.com

      SSLEngine  on

        #  指定通配符证书路径

        SSLCertificateFile  "/etc/ssl/certs/wildcard_example_public.crt"

        SSLCertificateKeyFile  "/etc/ssl/certs/wildcard_example.key"

        SSLCertificateChainFile  "/etc/ssl/certs/wildcard_example_chain.crt"

        #  ...  其他配置

</VirtualHost>

```

>  这种方式管理最简单,一张证书保护所有子域,但无法保护多级子域名(如`a.b.example.com`)。

方案三:独立虚拟主机(不同证书)

如果为每个域名都申请了独立的国密证书,则需要为每个域名创建独立的  `<VirtualHost>`  配置块,并在各自的块中指定对应的证书文件。

配置示例:

```apache

#  站点1:  www.example.com

<VirtualHost  *:443>

        ServerName  www.example.com

        SSLEngine  on

        SSLCertificateFile  "/etc/ssl/certs/example.com_public.crt"

        SSLCertificateKeyFile  "/etc/ssl/certs/example.com.key"

        SSLCertificateChainFile  "/etc/ssl/certs/example.com_chain.crt"

        DocumentRoot  "/var/www/example"

</VirtualHost>


#  站点2:  www.test.com

<VirtualHost  *:443>

        ServerName  www.test.com

        SSLEngine  on

        SSLCertificateFile  "/etc/ssl/certs/test.com_public.crt"

        SSLCertificateKeyFile  "/etc/ssl/certs/test.com.key"

        SSLCertificateChainFile  "/etc/ssl/certs/test.com_chain.crt"

        DocumentRoot  "/var/www/test"

</VirtualHost>

```

>  这种方式配置最灵活,每个站点独立,但证书管理成本较高。

三、进阶方案:双证书部署(兼容RSA与国密)

为了兼容只支持RSA的旧浏览器和必须用国密的合规要求,可采用“双证书”方案。该方案在同一端口(443)同时配置RSA和SM2两套证书,通过TLS的ALPN(应用层协议协商)  扩展,让Apache根据客户端支持的协议自动选择证书。

四、验证与测试

配置完成后,务必进行验证:

1.    检查配置语法:运行  `apachectl  configtest`  确保配置无误。

2.    重启Apache服务:运行  `systemctl  restart  httpd`  或  `apachectl  restart`  使配置生效。

3.    使用国密浏览器测试:在360安全浏览器、红莲花浏览器等国密浏览器中访问你的域名,查看地址栏是否有安全锁标识。

4.    在线工具检测:使用支持国密检测的在线SSL工具,检查证书链、算法套件(如`ECDHE-SM2-SM4-CBC-SHA256`)和部署情况。

总结一下,部署国密多域名证书的关键在于为每个域名建立独立的虚拟主机配置。根据你的证书类型(单域名、多域名SAN、通配符),选择在一个虚拟主机中用`ServerAlias`列出所有域名,或为每个域名创建独立的虚拟主机块。