根據this question當我們使用HTTPS時,所有的HTTP頭都被加密(包括請求URI和主機頭)。
當瀏覽器想要瀏覽網站上的一個使用HTTPS的頁面時,它首先創建安全連接,然後它發送HTTP請求(加密)並且服務器將答案返回給瀏覽器。現在假設有多個安全網站帶有多個SSL證書,所以當服務器想要創建安全連接時,它如何檢測應該使用哪個證書,因爲它不知道任何關於請求的信息!驗證共享主機上的SSL證書
回答
由於在接收到Host
標頭之前協商SSL通道,因此HTTPS服務器最多可以爲每個綁定的IP端點(IP地址和端口)使用一個證書。換句話說,要使用兩個不同的SSL證書,您需要將每個虛擬主機綁定到不同的端口或不同的IP地址。
您的陳述不正確 - TLS的服務器名稱擴展使這些要求過時。 –
據我所知,該擴展的支持尚未廣泛部署。 – cdhowie
所有主流瀏覽器和幾乎所有(如果不是全部)TLS庫都支持它。我相信,所有主流服務器都支持它。 –
這樣做的基礎是爲每個虛擬服務器提供一個SSL密鑰(set)。例如,在Apache中,它比較簡單。每個共享網站都可能在<VirtualHost>
指令中。 SSL密鑰可以在其中指定,因此僅適用於該虛擬主機。
粗糙例如:
<VirtualHost *:443>
ServerName server.com
SSLEngine on
SSLCertificateKeyFile /etc/ssl/server_com.key
SSLCertificateFile /etc/ssl/server_com.crt
SSLCertificateChainFile /etc/ssl/server_com.ca-bundle
的服務器將使用指定的鍵指向該網站通過HTTPS的所有請求。 Further details on the Apache site。類似的東西應該適用於大多數支持虛擬主機概念的Web服務器。
由於證書和域名匹配,您不會收到任何錯誤。
在TLS之前,服務器確實沒有辦法知道它應該呈現給客戶端的哪個主機的證書,並且這導致了問題。
在TLS中引入了一個名爲Server Name
的特殊擴展名(請參閱RFC 3546),它允許客戶端告訴服務器客戶端想要連接到的主機。根據此擴展的內容,服務器可以提供適當的證書。當然,所有這些都要求雙方都支持和使用TLS和擴展本身。
- 1. Android - SSL證書到IP - 仍然失敗的主機驗證
- 2. MaxCDN - 共享ssl - 無效證書?
- 3. 共享SSL證書作爲子域
- 4. TLS/SSL證書驗證
- 5. 驗證SSL證書對MITM
- 6. Libcurl SSL證書驗證
- 7. Android驗證SSL證書
- 8. SSL證書驗證Urllib2
- 9. 無法驗證SSL證書
- 10. SSL證書驗證失敗
- 11. SSL證書驗證編程
- 12. SSL證書籤名驗證
- 13. Boost.Asio SSL上下文未驗證證書
- 14. perl ssl證書ccert證書上的驗證失敗
- 15. 沒有主機名的SSL證書
- 16. 在共享主機上設置Amazon aws證書S3共享主機上的PHP php 3
- 17. 禁用證書主機名驗證
- 18. Boost,asio,https和主機/證書驗證
- 19. Azure上的單個站點帶有共享的SSL證書
- 20. Apache httpd虛擬主機SSL證書
- 21. 公共SSL證書錯誤
- 22. 如何在共享主機上使用Windows身份驗證?
- 23. 驗證SSL證書/密鑰的格式
- 24. 驗證nodejs中的ssl證書
- 25. 驗證iOS中的SSL證書
- 26. 關閉Ruby中的SSL證書驗證
- 27. 驗證SSL證書的確切程度?
- 28. FTPS(SSL)的證書驗證/安裝?
- 29. pychef中的ssl證書驗證
- 30. 驗證SSL證書的問題
請回顧[這個問題](http://stackoverflow.com/questions/5316513/is-ssl-possible-with-virtual-hosting-on-one-ip)及其答案。 –