【问题标题】:Apache 2.4 Restrict SSL to specific subdomain VhostsApache 2.4 将 SSL 限制为特定的子域虚拟主机
【发布时间】:2016-03-12 10:40:12
【问题描述】:

我有一个数字海洋水滴,只有一个 IPV4 地址可能。我想使用 SNI 将 TLS (SSL) 加密应用到特定的子域,而不是域的任何其他部分。

例如:

  • domain.com(无 TLS)
  • sub.domain.com(TLS,证书 1)
  • sub1.domain.com(TLS,证书 2)
  • sub2.domain.com(无 TLS)

我正在为证书使用 LetsEncrypt,因此无法使用通配符域。

domain.com.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName domain.com
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

sub.domain.com

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName sub.domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    </VirtualHost>
</IfModule>

sub1.domain.com

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName sub1.domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    </VirtualHost>
</IfModule>

sub2.domain.com

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName sub2.domain.com
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

【问题讨论】:

    标签: apache ssl sni


    【解决方案1】:

    你应该注意的两件事:

    1. 您永远不知道用户将使用哪些协议。如果未定义协议,它们将默认为 http,并且某些浏览器扩展将首先尝试使用 https,如果存在则使用它。
    2. 如果没有更好的匹配,Apache 将回退到为该端口定义的第一个站点。在这种情况下,如果您没有在端口 443 上定义 sub2.domain.com 站点,您最终可能会提供错误的站点。

    因此,您应该在端口 80 和端口 443 上定义所有 4 个域,并且基本上定义了 8 个虚拟主机。

    这也意味着需要购买(或从 LetsEncrypt 免费获得)证书以涵盖所有域,而不仅仅是您想通过 https 服务的两个域。

    那么你应该适当地使用重定向:

    1. domain.com(无 TLS):在端口 80 上服务站点。端口 443 的配置应该只是将所有流量重定向回 http://domain.com 上的等效页面

      李>
    2. sub.domain.com(TLS,证书 1): 在端口 443 上服务站点。端口 80 的配置应将所有流量重定向回 https://sub.domain.com 上的等效页面

    3. sub1.domain.com(TLS,证书 2):类似于上面第 2 点中提到的 sub.domain.com 设置。

    4. sub2.domain.com(无 TLS):类似于上面第一点中提到的 domain.com 设置。

    示例配置:

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    sub.domain.com
    
    <IfModule mod_ssl.c>
        <VirtualHost *:80>
            ServerAdmin webmaster@localhost
            ServerName sub.domain.com
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            RewriteEngine On
            RewriteCond %{HTTPS} off
            RewriteRule (.*) https://%{SERVER_NAME}/%$1 [R,L]
    
        </VirtualHost>
    </IfModule>
    sub1.domain.com
    
    <IfModule mod_ssl.c>
        <VirtualHost *:80>
            ServerAdmin webmaster@localhost
            ServerName sub1.domain.com
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            RewriteEngine On
            RewriteCond %{HTTPS} off
            RewriteRule (.*) https://%{SERVER_NAME}/%$1 [R,L]
    
        </VirtualHost>
    </IfModule>
    sub2.domain.com
    
    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName sub2.domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile  /etc/ssl/certs/ssl-cert-domain.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-domain.key
    
         RewriteEngine On
         RewriteRule (.*) http://%{SERVER_NAME}/%$1 [R,L]
    
    </VirtualHost>
    sub.domain.com
    
    <IfModule mod_ssl.c>
        <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            ServerName sub.domain.com
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile  /etc/ssl/certs/ssl-cert-subdomain.pem
            SSLCertificateKeyFile /etc/ssl/private/ssl-cert-subdomain.key
        </VirtualHost>
    </IfModule>
    sub1.domain.com
    
    <IfModule mod_ssl.c>
        <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            ServerName sub1.domain.com
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile  /etc/ssl/certs/ssl-cert-subdomain1.pem
            SSLCertificateKeyFile /etc/ssl/private/ssl-cert-subdomain1.key
        </VirtualHost>
    </IfModule>
    sub2.domain.com
    
    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName sub2.domain.com
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
         SSLEngine on
         SSLCertificateFile  /etc/ssl/certs/ssl-cert-subdomain2.pem
         SSLCertificateKeyFile /etc/ssl/private/ssl-cert-subdomain2.key
    
         RewriteEngine On
         RewriteRule (.*) http://%{SERVER_NAME}/%$1 [R,L]
    
    </VirtualHost>
    

    但是,如果遇到所有这些麻烦,那么可能需要重新考虑不通过 h​​ttps 提供所有服务。

    【讨论】:

    • 你有这个配置的例子吗?我已经尝试为每个域和子域设置端口 80 和 443 虚拟主机,但是它在 SSL 工作时是全有或全无。要么所有域都可以通过 SSL 访问,要么没有。如果我禁用 domain.com 的 SSLEngine,那么即使定义了名称,所有这些都将被禁用。我正在使用 chrome。
    • 添加了示例配置。
    猜你喜欢
    • 2014-12-28
    • 2012-01-29
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多