如何調整 Apache 以僅顯示 HTTPS 協定上的一台主機

如何調整 Apache 以僅顯示 HTTPS 協定上的一台主機

我在 FreeBSD 上有一個 Web 伺服器 Apache,並且只想將 SSL 綁定到多個網域之一。現在我的配置是

NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

一切正常,但在瀏覽器中https://www.domain01.com/顯示 ssldomain.com 網站的頁面。這是壞的。

如何調整 Apache 以防止顯示 ssldomain.com 頁面https://www.domain01.com在瀏覽器中。

UPD:我試著為兩個網域定義 VirtualHosts :80 和 :443 。 1) 兩個網域均使用 ssldomain.com 的原始 SSL; 2) ssldomain.com 使用原始 SSL,domain01.com 使用自簽名 SSL。在這兩種情況下,瀏覽器都顯示 HTTPS 憑證錯誤,但頁面正確。

這兩種情況的配置

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCertificateFile "/usr/local/etc/apache22/ssl/domain01.com/server.cert"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/domain01.com/server.key"
# This is for second case (of course 2 lines above are comments)
# SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
# SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
# SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

#Redirect permanent / http://www.domain01.com/
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

最誠摯的問候!

答案1

如果 Apache 找不到具有相符的 ServerName 或 ServerAlias 的虛擬主機,則 Apache 將預設使用該 IP(或在本例中與 * 等相符的通配符)和連接埠 (443) 的第一個虛擬主機。因此,您需要在連接埠 443 上為 www.domain01.com 設定一個單獨的站點,就像您對 www.ssldomain.com:443 所做的那樣,這樣它就不會回退到您唯一的預設站點。

如果需要,可以將此虛擬主機設定為重定向回 HTTP(請注意此重定向已完成SSL 協商因此仍然需要有效的證書 - 每個 SSL 虛擬主機都需要為其設定證書,儘管您可以使用相同的證書(如果它也對該虛擬主機有效)。

在這一點上,你怎麼沒有收到證書錯誤https://www.domain01.com?我猜想要么你是(並且只有當你忽略它時你才會看到www.ssldomain.com 內容),要么你的證書涵蓋了其中的兩個域(在這種情況下,將其設置為單獨的虛擬主機並且重新導向回http 絕對是要走的路)。

順便說一句,與普遍的看法相反,你這樣做不是需要一個單獨的 IP 位址在 Apache 實例上設定多個 SSL 主機 - 即使對於不支援 SNI 的舊瀏覽器也是如此。還有另一種解決方法。請參閱此處以了解更多詳細資訊:在 Apache 上停用特定虛擬主機的 SNI

答案2

這對我有用,我只更改網域的順序 - 第一個是具有原始 SSL 憑證的 ssldomain.com,第二個是具有相同 SSL 憑證和重定向的 domain01.com。

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

Redirect permanent / http://www.domain01.com/
</VirtualHost>

特別感謝@BazzaDP。

相關內容