Apache:允许一台主机使用 TLS 1.0,同时强制所有其他主机使用 1.2?

Posted

技术标签:

【中文标题】Apache:允许一台主机使用 TLS 1.0,同时强制所有其他主机使用 1.2?【英文标题】:Apache: Allow TLS 1.0 for one host while forcing all others to use 1.2? 【发布时间】:2018-08-23 00:03:10 【问题描述】:

有没有办法将 Apache mod_ssl 配置为允许对一个特定 IP 使用 TLS 1.0,同时对所有其他 IP 强制使用 TLS 1.2? 我需要支持来自仅支持 TLS 1.0 的旧系统的连接,但我不想为每个主机完全打开 TLS 1.0。 我知道 IP 欺骗等,但基于 IP 的限制(如果可能的话)似乎是在旧系统被替换之前的最佳折衷方案。

【问题讨论】:

不起作用,请参阅serverfault.com/questions/637344/… 了解基本原理。 【参考方案1】:

有两种方法可以解决您的问题,具体取决于您的客户端的行为方式,或者取决于您的偏好(带有 Allow 指令的本机 Apache,或基于 Rewrite)

您需要知道客户端是否支持 SNI(捕获握手将回答此问题)。大多数客户端都支持它,即使是 TLS 1.0,但由于它是一个遗留系统,可能不支持。

如果不支持 SNI,您可以声明两个虚拟主机,其想法是将所有遗留请求发送到第一个 VH(支持 TLS 1.0),第二个 VH 将回答其他人。 IP 检查由 Allow 指令完成:

NameVirtualHost *:443
SSLStrictSNIVHostCheck off

# For the legacy
<VirtualHost *:443>
  DocumentRoot /var/www/html
  ServerName unknown

  SSLProtocol TLSv1
  <Directory "/var/www/html">
    Order Deny,Allow
    Deny from all
    Allow from 192.168.1.50 # your legacy ip
  </Directory>
</VirtualHost>

# For all others
<VirtualHost *:443>
  DocumentRoot /var/www/html
  ServerName my.domain.com

  SSLProtocol TLSv1.2
  <Directory "/var/www/html">
    Order Deny,Allow
    Allow from all
  </Directory>
</VirtualHost>

如果允许 SNI,我们可以使用 RewriteCond 解决问题。我相信它需要更多的 CPU,因为使用 RewriteEngine,但解决方案 1 也可以用这个替代。您需要启用 Rewrite 和 Remoteip 模块。

NameVirtualHost *:443
SSLStrictSNIVHostCheck on

# For all others
<VirtualHost *:443>
  DocumentRoot /var/www/html
  ServerName my.domain.com

  SSLProtocol TLSv1 TLSv1.2

  RewriteEngine On
  RewriteCond %SSL:SSL_PROTOCOL ^TLSv1$
  RewriteCond %REMOTE_ADDR !"192.168.1.50" #your legacy ip
  RewriteRule .* "-" [F]

  <Directory "/var/www/html">
    Order Deny,Allow
    Allow from all
  </Directory>
</VirtualHost>

让我们知道结果。

【讨论】:

以上是关于Apache:允许一台主机使用 TLS 1.0,同时强制所有其他主机使用 1.2?的主要内容,如果未能解决你的问题,请参考以下文章

TLS 1.0 服务器和 TLS 1.1 服务器之间的 Web 服务

SSH客户端无法远程连接其中一台Linux主机,但远程同网段其它主机均可以正常连接,都能ping通。

无法在 TLS 1.2 中的客户端计算机上使用密码套件

在一台 Apache 服务器上的单独虚拟主机中运行 Apache mod_php 和 mod_fastcgi

配置apache虚拟主机,实现在一台服务器上运行多个网站

SNI: 实现多域名虚拟主机的SSL/TLS认证