IIS 8.5 上的 HSTS 和重定向
我無法讓我的 IIS 8.5 伺服器按預期執行。我正在嘗試使用單獨的網路伺服器在同一個 IP 地址上託管兩個域,都在 https 上。
自然地,IIS 被設置為我的“主要”網路伺服器,監聽 80 和 443。這裡設置了一個帶有 ssl 證書的域。我正在使用“URL Rewrite”模組將不安全的流量發送到安全端。另一個域設置為虛擬主機,並使用“HTTP 重定向”功能將流量發送到第二個網路伺服器。對於第二個網路伺服器,我有 Apache 2.4 在 8443 上監聽,也帶有證書。
所以,簡單地說: http://example1.com -> URL Rewrite -> https://example1.com https://example1.com -> 從 IIS 解析和提供服務
http://example2.com -> HTTP 重定向 -> https://example2.com:8443 https://example2.com:8443 -> 由 Apache 解析和服務
我的問題是在瀏覽器(FF 或 Chrome)訪問http://example2.com>並重定向到<https://example2.com:8443>後,後續訪問總是轉到<https://example2.com(沒有埠) . 這失敗了,因為在 ssl 握手期間,瀏覽器獲得了 example1 的證書。
我已經追踪到這兩個依賴 HSTS 的瀏覽器。一旦我清除了 HSTS 記憶體,他們就能夠再次找到正確的站點(使用埠)。
我怎樣才能讓這個設置順利工作?我在 Apache 的 conf 中沒有看到任何設置 HSTS 的內容,所以我認為它在 IIS 重定向中。我查看了這個在 IIS 上討論 HSTS 的答案
max-age
,認為我可以修改 Doug 的建議以將其設置為零以防止它被設置,但它似乎不起作用。解決方案:
根據下面的建議,最好的解決方案是在 IIS 中託管兩個域,綁定 SSL 證書並選中綁定中的“需要伺服器名稱指示”框。我必須對所有共享 IP 的域執行此操作。然後我可以創建一個反向代理(需要 URL 重寫和應用程序請求路由模組),它將流量傳遞給 Apache 託管的實例。
你不能用你目前的設置。
HSTS RFC聲明如下:
UA 必須用“https”[RFC2818] 替換 URI 方案,並且
如果 URI 包含顯式埠組件“80”,則 UA 必須將埠組件轉換為“443”,或者
如果 URI 包含不等於“80”的顯式埠組件,則必須保留埠組件值;除此以外,
如果 URI 不包含顯式埠組件,則 UA 不得添加一個。
注意:這些步驟確保 HSTS 策略適用於通過 HSTS 主機的任何 TCP 埠的 HTTP。
所以去http://www.example2.com:8443>將保留埠並重定向到<https://www.example2.com:8443>但你不能從<http://www.example2.com做同樣的事情。
所以你有以下選擇:
- 停止在 Apache 中為 example2.com 使用 HSTS,只在 IIS 中為 example1.com 使用它
- 使用一台主伺服器監聽埠 80 和 443,並將 example.com 請求代理到埠 8443 上的另一台伺服器。這更乾淨,因為不需要使用者在非標準埠(如 8443)上使用。但是,由於您使用相同的 IP 地址,您要麼必須使用稱為伺服器名稱辨識或 SNI 的程序(XP/IE8 等較舊的瀏覽器不支持)才能通過相同的 IP 地址正確地為相同的主機提供服務HTTPS,或為兩個站點使用相同的證書作為解決方法(請參閱此處的答案以了解其工作原理)。