在服务于不同域的 apache 虚拟主机之间共享 SSL 配置

Posted

技术标签:

【中文标题】在服务于不同域的 apache 虚拟主机之间共享 SSL 配置【英文标题】:Sharing SSL Configuration between apache virtualhosts serving different domains 【发布时间】:2021-09-22 19:49:33 【问题描述】:

我为 apache2 服务的每个域都有一个虚拟主机。

类似的东西 /etc/apache2/sites-available/1.conf

<VirtualHost *:443>
    ServerName xyz.com
    ServerAlias www.xyz.com
    SSLEngine on
    SSLCertificateFile /etc/.../cert.pem
    SSLCertificateKeyFile /etc/.../privkey.pem
    SSLCertificateChainFile /etc/.../chain.pem
</VirtualHost

<VirtualHost *:443>
    ServerName qwert.com
    ServerAlias www.qwert.com
    SSLEngine on
    SSLCertificateFile /etc/.../cert.pem
    SSLCertificateKeyFile /etc/.../privkey.pem
    SSLCertificateChainFile /etc/.../chain.pem
</VirtualHost

我想添加一些 SSL 设置,指定密码套件和允许的 TLS 版本,以便在所有启用 SSL 的站点之间共享它们。 这样我就可以集中更改它们,而不是编辑每个虚拟主机。

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

如何集中处理?

【问题讨论】:

【参考方案1】:

或者,您可以将 SSL 配置放入一个文件中,并将该文件包含在每个虚拟主机中。

幸运的是 Letsencrypt 已经为你创建了这样一个文件:搜索 options-ssl-apache.conf

locate options-ssl-apache.conf 

示例包括

<VirtualHost ...>
   Include /etc/letsencrypt/options-ssl-apache.conf
   ...
</VirtualHost>

最后是他们的示例文件,让 https 更安全的letsencrypt方式:

SSLEngine on

# Intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off

SSLOptions +StrictRequire

Add vhost name to log entries:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-agenti\"" vhost_combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common

此配置在https://www.ssllabs.com/ssltest/ 得到A+

【讨论】:

谢谢,我认为这比变量更干净!虽然变量允许集中更改,但您无法在不触及所有配置文件的情况下轻松添加新变量。【参考方案2】:

Apache 提供了Define 指令,它定义了可以在其他地方使用的变量。

在 /etc/apache2/apache.conf 的顶部,我定义了所有我想要集中的 SSL 设置。

Define honor_ssl_cipher_order on
Define ssl_protocol "all -SSLv2 -SSLv3"
Define ssl_cipher_suite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"

然后在每个虚拟主机中我都可以

<VirtualHost *:443>
...
        SSLProtocol $ssl_protocol
        SSLHonorCipherOrder $honor_ssl_cipher_order
        SSLCipherSuite "$ssl_cipher_suite"
</VirtualHost>

【讨论】:

以上是关于在服务于不同域的 apache 虚拟主机之间共享 SSL 配置的主要内容,如果未能解决你的问题,请参考以下文章

Linux 服务器之间如何进行文件目录共享

七Xenserver配置存储

配置NFS服务器

Samba服务(匿名用户访问本地用户访问虚拟用户访问)

在同一域的两个网站之间共享 cookie

http协议--Apache-Httpd服务基本配置-rpm安装-编译安装(HTTP2.2,HTTP2.4)