在 Apache 上禁用特定虛擬主機的 SNI
我們有一個帶有幾個網際網路 IP 的網路伺服器。
我已經成功設置了基於 SNI 名稱的虛擬主機,效果很好。不過,我想做的是讓我們的主站點不使用 SNI 並單獨使用唯一 IP 地址之一,以便改進我們的瀏覽器對該站點的支持(XP/IE 組合..)
我們運營著一個非常受歡迎的網站,該網站有大量使用者使用嚴重過時的瀏覽器,因此這對我們來說非常重要。
在 CentOS 6 上執行 Apache 2.2 (2.2.15-47.el6_7)。
正如其他人所說,只需將第一個站點作為第一個虛擬主機,無論是否啟用 SNI,它都會起作用:
<VirtualHost *:443> ServerName www.site1.com DocumentRoot /site1/ SSLCertificateKeyFile /ssl/server1.key SSLCertificateFile /ssl/server1.crt </VirtualHost> <VirtualHost *:443> ServerName www.site2.com DocumentRoot /site2/ SSLCertificateKeyFile /ssl/server2.key SSLCertificateFile /ssl/server2.crt </VirtualHost>
但是,站點 2 的非 SNI 瀏覽器將獲得站點 1 的證書,因此會出錯(使用者可能想知道為什麼他們有不同站點的證書,儘管如果仍在非 SNI 瀏覽器上,他們可能不是那樣精通技術)。
但是,儘管存在明顯的 SNI 問題,但如果您有一個涵蓋所有站點主題備用名稱欄位的單一證書,則可以為您的所有站點的****所有使用者提供訪問權限。
然後,您可以擁有兩個使用相同密鑰和證書的虛擬主機:
<VirtualHost *:443> ServerName www.site1.com DocumentRoot /site1/ SSLCertificateKeyFile /ssl/server.key SSLCertificateFile /ssl/server.crt </VirtualHost> <VirtualHost *:443> ServerName www.site2.com DocumentRoot /site2/ SSLCertificateKeyFile /ssl/server.key SSLCertificateFile /ssl/server.crt </VirtualHost>
因此,您對兩個站點(或三個,或更多,如果您願意)擁有相同的密鑰和證書。
因此,即使沒有 SNI 支持,www.site1.com 也始終是預設主機。
對於 www.site2.com,它變得更有趣:
- 對於支持 SNI 的瀏覽器,它們提供伺服器名稱並直接轉到 site2 虛擬主機配置,這樣就可以了。
- 對於不支持 SNI 的瀏覽器,它們預設使用 site1 配置,它返回它的證書,但由於證書適用於兩個站點,這實際上沒問題。SSL 協商完成後,第一個 Web 請求進來,但這次給伺服器指定了伺服器名稱,它可以正確地從 /site2/ 目錄提供文件。
所以這是可行的,因為 https 連接涉及兩個不同且不相關的步驟:1)進行 SSL 協商和 2)使用該 SSL 連接請求文件,這兩個步驟不必來自同一個虛擬主機(儘管大多數人認為它確實如此)。
此選項的主要缺點是,根據網站的密切相關程度,在同一個證書上有兩個不同的 URL 可能看起來不專業。但是,如果他們共享主機,他們可能是一些相關的業務(除非伺服器歸託管公司所有),所以這可能不是問題。
我發現這是一個方便的小解決方法,特別是對於我可能希望在一個 IP 地址上託管多個站點的開發伺服器,我在主題替代名稱欄位中使用帶有多個 URL 的自簽名美分。