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

时间:2018-03-14 12:41:07

标签: apache ssl tls1.2 mod-ssl tls1.0

有没有办法配置Apache mod_ssl以允许一个特定IP使用TLS 1.0,同时为所有其他IP强制执行TLS 1.2? 我需要支持来自仅支持TLS 1.0的遗留系统的连接,但我不想为每个主机完全打开TLS 1.0。 我知道IP欺骗等,但基于IP的限制 - 如果可能的话 - 似乎是最好的妥协,直到遗留系统被替换。

1 个答案:

答案 0 :(得分:0)

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

您需要知道客户端是否支持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>

让我们知道结果。