簡體   English   中英

Apache 2.4 將 SSL 限制為特定子域 Vhosts

[英]Apache 2.4 Restrict SSL to specific subdomain Vhosts

我有一個 digitalocean droplet,只有一個 IPV4 地址。 我想使用 SNI 僅將 TLS (SSL) 加密應用於特定的子域,而不是域的任何其他部分。

例子是:

  • domain.com(無 TLS)
  • sub.domain.com(TLS,證書 1)
  • sub1.domain.com(TLS,證書 2)
  • sub2.domain.com(無 TLS)

我使用 LetsEncrypt 作為證書,所以通配符域是不可能的。

域名.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>

子域名.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>

你應該注意兩件事:

  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 提供所有服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM