Apache-2.2

Apache SNI namevhosts 總是路由到第一個 VirtualHost 條目

  • February 25, 2022

<VirtualHost *:443>無論 ServerName/ServerAlias 欄位上的 SNI 是否匹配,Apache 似乎都會將所有 https 請求路由到第一個請求。

Apache 使用 SNI 建構

伺服器版本:Apache/2.2.22 (Ubuntu)

伺服器建構時間:2013 年 3 月 8 日 15:53:13

OpenSSL 1.0.1 2012 年 3 月 14 日

error.log 報告:

Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)

這表明 SNI 正在按照http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI工作(如何判斷您的 Apache 建構是否支持 SNI?)

SSL_TLS_SNI似乎在使用 HTTPS 請求時設置得當(用 驗證phpinfo()

配置:

<IfModule mod_ssl.c>
   # If you add NameVirtualHost *:443 here, you will also have to change
   # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
   # to <VirtualHost *:443>
   # Server Name Indication for SSL named virtual hosts is currently not
   # supported by MSIE on Windows XP.
   NameVirtualHost *:443
   Listen 443
</IfModule>

#<VirtualHost *:443>
#       <Location />
#               Order allow,deny
#               Deny from all
#       </Location>
#</VirtualHost>

<VirtualHost *:443>
       SSLEngine on
       ServerAdmin webmaster@localhost
       ServerName server.com
       ServerAlias server.com
       DocumentRoot /web/default
       ErrorLog ${APACHE_LOG_DIR}/error.log

       # Possible values include: debug, info, notice, warn, error, crit,
       # alert, emerg.
       LogLevel warn

       CustomLog ${APACHE_LOG_DIR}/access.log combined

       SSLCertificateFile /path/server.com.crt
       SSLCertificateKeyFile /path/server.com.key
</VirtualHost>
<VirtualHost *:443>
       SSLEngine on
       ServerAdmin webmaster@localhost
       ServerName alias.com
       ServerAlias alias.com
       DocumentRoot /web/default
       ErrorLog ${APACHE_LOG_DIR}/error.log

       # Possible values include: debug, info, notice, warn, error, crit,
       # alert, emerg.
       LogLevel warn

       CustomLog ${APACHE_LOG_DIR}/access.log combined

       SSLCertificateFile /path/alias.com.crt
       SSLCertificateKeyFile /path/alias.com.key
</VirtualHost>

https://server.com>和<https://alias.com都嘗試從 server.com 提供證書(如果您忽略證書警告,則提供內容)

類似的配置使用 HTTP:80 可以正常工作(唯一的變化是 SSLEngine 和證書/密鑰路徑)

如果我取消註釋第一個虛擬主機(限制對已定義站點的 HTTPS 訪問),那麼我總是會收到 SSL 錯誤(即使它是已定義站點)

謝謝

編輯:

附加標誌

SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLStrictSNIVHostCheck on
SSLVerifyClient none
SSLProxyEngine off

SSLStrictSNIVHostCheck on所以它應該只支持啟用 SNI 的瀏覽器

apache2ctl -S輸出:

*:443                  is a NameVirtualHost
        default server server.com (/etc/apache2/sites-enabled/000-default:22)
        port 443 namevhost server.com (/etc/apache2/sites-enabled/000-default:22)
        port 443 namevhost alias.com (/etc/apache2/sites-enabled/000-default:39)
        port 443 namevhost other.com (/etc/apache2/sites-enabled/other:22)

更新

因此,出於某種奇怪的原因,問題似乎已經解決了。

也許這是某種奇怪的記憶體問題或其他東西(儘管我已經apache2ctl stop/start/restartsudo service apache2 stop/start/restart/reloaded 很多次並且已經在伺服器上本地執行了測試以及使用了幾台不同的機器)。

如果它可以作為任何參考,請隨意記下這個問題或將其保留。

感謝所有的幫助傢伙!

您的配置看起來不錯;已包含指令 SSLEngine On;根據日誌消息,問題似乎來自客戶端。

並非所有客戶端都支持 SNI,但大多數客戶端都支持。這取決於 SSL 協商是如何進行的,由系統(在 Win XP 上不起作用)或瀏覽器(版本必須足夠新)。查看支持 SNI 的瀏覽器列表。如果您必須確保所有客戶端都可以訪問您的網站,則由於這些舊版本(瀏覽器或系統),您不能使用 SNI。您需要每個 ServerName 一個 IP 並使用 VirtualHost $ IP_alias:443 for ServerName alias.com and VirtualHost $ IP_server:443 用於 ServerName server.com 而不是 VirtualHost *:443 用於兩者。

引用自:https://serverfault.com/questions/510132