![具有共用設定和集中憑證的 Auzre Web 場上的 SSL 故障](https://rvso.com/image/1402624/%E5%85%B7%E6%9C%89%E5%85%B1%E7%94%A8%E8%A8%AD%E5%AE%9A%E5%92%8C%E9%9B%86%E4%B8%AD%E6%86%91%E8%AD%89%E7%9A%84%20Auzre%20Web%20%E5%A0%B4%E4%B8%8A%E7%9A%84%20SSL%20%E6%95%85%E9%9A%9C.png)
[抱歉,如果這個問題有點長,有很多額外的資訊以防相關]
概述
我在 Azure 中的 4 個虛擬機器的負載平衡場上遇到 SSL 問題。如果 HTTPS 請求傳送至場中的第一台伺服器,則一切正常。如果它到達其他 3 個中的任何一個,則呼叫失敗。 Chrome會發出SSL協定錯誤,IE和Firefox只是說頁面無法顯示。
設定
我在 Azure 上有四個 Windows Server 2012 VM(小型執行個體僅用於測試)。 VM 位於相同雲端服務和可用性集中。已為連接埠 80 和 443 新增負載平衡端點(直接伺服器返回為不是啟用這些)。所有四台機器都是透過相同的 PowerShell 腳本設定的,除了兩個例外,都是以這種方式完全配置的。
每台伺服器的 IIS 配置設定為使用共用配置,該配置透過 DFS 從群組中的第一台伺服器複製到每台伺服器。這是為每台伺服器手動配置的並且工作正常。
DFS 也用於將 webs 資料夾從第一台伺服器複製到其他伺服器。
在編寫部署腳本後,我還發現了「新的」集中證書功能,因此也在四台伺服器上手動安裝和設定了該功能。我使用單獨伺服器上的共用來儲存憑證檔案。
憑證請求是在第一台伺服器上產生的,我使用 SSL.com 為某個位址取得了 90 天的免費 SSL subdomain.domain.com
。我subdomain
為 DNS新增了一筆 CNAME 記錄,用於domain.com
指向 Azurecloudapp
位址。
我將 SSL 憑證匯入到第一台伺服器中,然後再次將其匯出為subdomain.domain.com.pfx
(帶有密碼)並將其複製到憑證檔案共用中。在檢查所有四台伺服器上的集中式證書時,他們列出了良好的證書,沒有錯誤圖標指示配置上的密碼錯誤等。
最後,我更改了伺服器 1 的綁定以新增帶有主機名稱的 httpssubdomain.domain.com
以及需要伺服器名稱指示和使用集中證書存儲選項已選取。檢查其他伺服器顯示綁定按預期傳播。
問題
我新增了一個基本頁面,它只是顯示處理請求的伺服器的名稱。如果我對多個 IE 視窗進行 shell 訪問http://subdomain.domain.com
,它們將列印各種伺服器名稱,顯示 IIS 配置和 Web 檔案已正確部署,並且 Azure 負載平衡功能也正在執行此操作。我發現這實際上很酷。
然而,當我透過 HTTPS 嘗試此操作時,它就付諸東流了。只有命中第一個伺服器的請求會成功,其餘的請求會崩潰並顯示“此頁面無法顯示”或“SSL 協定錯誤”,具體取決於我測試的瀏覽器。在伺服器1上,頁面顯示正常,憑證可見且沒有憑證錯誤。
我確信這是某個伺服器上的設定問題,但我只是不知道它到底是什麼。我正在使用的大部分內容對我來說都是新的,因為過去我們使用帶有 IIS6 的實體非叢集 Windows 2003 伺服器。
更令人困惑的是,我在一夜之間關閉了四個虛擬機,當我今天早上重新啟動服務時,除了伺服器1 之外,伺服器2 現在顯然還響應SSL 請求。完全關閉了,並且之後仍然只有伺服器 1 工作。
IIS 日誌檔案不顯示失敗的 SSL 請求,僅顯示伺服器 1 和 2 上連接埠 80 的一堆 200 以及連接埠 443 的 200 和 304 的混合。
我對谷歌搜尋進行了一些盡職調查,但沒有任何線索。事實上恰恰相反,據我所知,我所做的應該是有效的。
任何有助於解決此問題的建議將不勝感激。
答案1
我想分享一些應該可以解決 IIS 上集中憑證儲存的大多數問題的步驟。集中式憑證儲存 (CCS) 建立一個虛假憑證綁定,用於將 SSL 憑證要求傳送到 CCS。如果此綁定不存在或相同 IP 位址上有多個綁定,則當用戶端嘗試連線到啟用 SSL 的網站時,您將收到瀏覽器錯誤。
考慮以下設定;172.16.0.41
啟用 IP 位址和集中憑證儲存的 IIS 伺服器包含兩個網域;www.adomain.com
和www.bdomain.com
。 PFX 憑證套件安裝在每個網域的 IIS 集中憑證儲存中。
通常有兩個錯誤;
問題1
當瀏覽器連接到網站時,會分享錯誤的憑證。例如,www.adomain.com
第一次存取會導致提供正確的證書,但是當瀏覽器存取 時www.bdomain.com
,會傳回 的證書www.adomain.com
,導致瀏覽器標記無效證書錯誤。
解決方案
出現此問題的原因通常是因為多個網站綁定了同一個IP位址,並且至少有一個網站沒有啟用需要伺服器名稱標識。如果沒有為共享相同 IP 和連接埠的所有網站啟用此設置,IIS 將無法確定要提供服務的證書,因此第一個獲勝政策似乎適用。
這意味著對同一 IIS 伺服器上託管的其他網站的後續請求將傳回錯誤的憑證。
解決步驟
確保每個網站都設定為
Require Server Name Identification
.為此,請點擊 IIS 管理員中的每個網站,選擇“綁定...”->選擇“HTTPS 綁定”->選擇“編輯”->“檢查”Require Server Name Identification
並確保Use Centralized Certificate Store
也選中。檢查伺服器上的綁定。從提升的命令框執行
netsh http show sslcert
應存在 CCS 的綁定:
SSL Certificate bindings:
-------------------------
Central Certificate Store : 443
Certificate Hash : (null)
Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name : (null)
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
請注意,與憑證雜湊的綁定(null)
表示存在 CCS 直通綁定。如果有任何其他綁定正在偵聽伺服器的 IP 位址和 SSL 連接埠(172.16.0.41:443
在我們的場景中),則需要將其刪除。
若要刪除綁定,請鍵入
netsh http delete sslcert <binding>
。在我們的場景中就是這樣netsh http delete sslcert 172.16.0.41:443
,並且應該刪除綁定。(null)
不應刪除 CCS 直通綁定。如果此綁定不存在,請參閱問題2以下。使用重置 iis
iisreset
並連接到 Web 伺服器上的每個網域。應共享正確的證書。您也可以透過重複步驟 2 並確保不IP:PORT
存在與您的 SSL 連接埠和 Web 伺服器 IP 的 特定綁定來檢查綁定。
問題2
即使在確認集中憑證儲存已啟用、對憑證具有可見性並且所有網站都必須使用它之後,當瀏覽器連接到網站時,它也會引發Page Cannot be displayed
或invalid encryption
錯誤。不顯示預期的網站。
在 IE (Edge) 中,這通常表現為建議檢查瀏覽器中是否啟用了適當的加密類型。
或iisreset
重新啟動伺服器無法解決該問題。
解決方案
這似乎是創建 CCS 傳遞綁定時的一個錯誤。啟用 CCS 功能時,它不會在 Web 伺服器上創建,因此傳入的憑證要求會被靜默丟棄。
解決步驟
首先檢查集中憑證儲存是否已啟用並且可以看到其路徑中的所有憑證。為此,請檢查
IISManager
選擇伺服器節點 -> 集中憑證(在管理部分下) -> 編輯功能設定..並確保其已配置和啟用。檢查所有使用通用憑證的網站是否已綁定CCS。為此,請點擊 IIS 管理員中的每個網站,選擇“綁定...”->選擇“HTTPS 綁定”->選擇“編輯”->“檢查”
Require Server Name Identification
並確保Use Centralized Certificate Store
也選中。檢查CCS綁定是否已建立。跑步
netsh http show sslcert
。如果結果為空或(null)
傳遞憑證不存在(請參閱問題 1 下的步驟 2,以了解 CCS 綁定的外觀),則 CCS 綁定尚未啟用。SSL Certificate bindings: -------------------------
在 IIS 管理員中,選擇一個使用 CCS 的網站,按一下「綁定...」->選擇「HTTPS 綁定」->選擇「編輯」->然後取消選取
Use Centralized Certificate Store
和取消選取Require Server Name Identification
。
在SSL certificate
下拉清單中,選擇伺服器預設WMSVC
憑證並點擊OK
。讓Site Bindings
窗戶開著。
切換回提升的命令提示字元並運行
netsh http show sslcert
。這應該會產生如下所示的綁定:SSL Certificate bindings: ------------------------- IP:port : 172.16.0.41:443 Certificate Hash : 64498c920fecb31b8f7ccbdac2fa2baa2ec4f19a Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914} Certificate Store Name : My Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
返回視窗並
Site Bindings
恢復步驟 4 中的變更。Require Server Name Indication
Use Centralized Certificate Store
OK
切換回提升的命令提示字元並
netsh http show sslcert
再次運行 - 如果眾神對你微笑 - 集中證書存儲綁定應該已經存在,替換當前的綁定:SSL Certificate bindings: ------------------------- Central Certificate Store : 443 Certificate Hash : (null) Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
如果您看到上面的憑證與(null)
值的綁定Certificate Hash
,它已經起作用,並且現在應該啟用 CSS 傳遞。
- 啟動瀏覽器並嘗試透過安全通訊端 (HTTPS) 連接到伺服器上的網域,一切都應該順利。
重要筆記
您需要在網路場中的每個網路伺服器上重複此過程。應該可以透過 PowerShell 來自動化和檢查該過程。
建立直通綁定後,它將無限期保留(除非您在節點上停用集中式憑證支援)。
作為旁白;此連結提供了有關 CCS 如何在技術層面上工作的信息,值得一讀:https://blogs.msdn.microsoft.com/kaushal/2012/10/11/central-certificate-store-ccs-with-iis-8-windows-server-2012/
我希望這有幫助。