針對 SSL 相關問題進行疑難解答 (伺服器憑證)
適用於:網際網路資訊服務 6.0、網際網路資訊服務 7.0 和更新版本
概觀
本文可協助您僅針對與 網際網路資訊服務 (IIS) 相關的安全套接字層 (SSL) 問題進行疑難解答。 它涵蓋用於伺服器驗證的伺服器憑證,且未涵蓋客戶端憑證。
如果 [用戶端憑證] 區段設定為 [需要],然後遇到問題,則這不是您應該參考的文章。 本文僅供針對 SSL 伺服器憑證問題進行疑難解答。
請務必知道,每個憑證都包含公鑰(用於加密)和私鑰(用於解密)。 只有伺服器才知道私鑰。
HTTPS 的預設埠為 443。 假設您在 SSL 交握期間精通 SSL 交握和伺服器驗證程式。
此疑難解答員中使用的工具
用來針對各種案例進行疑難解答的工具如下:
- SSLDiag
- 網路監視器 3.4 或 Wireshark
案例
透過 HTTPS 瀏覽網站時,您會看到下列錯誤訊息:
必須檢查的第一個先決條件是網站是否可透過 HTTP 存取。 如果不是,可能還有本文未涵蓋的個別問題。 使用此疑難解答員之前,您必須讓網站在 HTTP 上運作。
現在,假設網站可透過 HTTP 存取,而且當您嘗試瀏覽 HTTPS 時,會顯示先前的錯誤訊息。 因為 SSL 交握失敗,因此會顯示錯誤訊息。 在接下來的幾個案例中,可能會有許多原因詳述。
案例 1
檢查伺服器證書是否有對應的私鑰。 請參閱 [憑證] 對話框的下列螢幕快照:
解決方法
如果遺失私鑰,則您需要取得包含私鑰的憑證,這基本上是 。PFX 檔案。 以下是您可以嘗試執行的命令,以將私鑰與憑證產生關聯::
C:\>certutil - repairstore my "[U+200E] 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33"
如果關聯成功,您會看到下列視窗:
在此範例中, 1a 1f 94 8b 21 a2 99 36 77 a8 8e b2 3f 42 8c 7e 47 e3 d1 33
是憑證的指紋。 若要取得指紋:
- 開啟憑證。
- 選取 [詳細資料] 索引標籤。
- 向下捲動以尋找指紋區段。
- 選取指紋區段,然後按下下方的文字。
- 執行 Ctrl A,然後按 Ctrl++C 來選取並複製它。
注意
命令 certutil
不一定會成功。 如果失敗,您必須從證書頒發機構單位取得包含私鑰的憑證。。
案例 2
在此案例中,請考慮您有一個伺服器證書,其中包含安裝在網站上的私鑰。 不過,您會繼續看到案例 1 中顯示的錯誤。 您仍然無法透過 HTTPS 存取網站。
解決方法
在伺服器上下載並安裝 SSL 診斷 工具。
如果您有包含私鑰且仍然無法存取網站的憑證,請嘗試執行此工具,或檢查系統事件記錄中是否有 SChannel 相關警告或錯誤。
執行 SSLDiag 工具時,您可能會看到下列錯誤訊息:
您有對應至此憑證的私鑰,但 CryptAcquireCertificatePrivateKey 失敗。
此外,下列 SChannel 警告會出現在系統事件記錄檔中:
Event Type: Error Event Source: Schannel Event Category: None Event ID: 36870 Date: 2/11/2012 Time: 12:44:55 AM User: N/A Computer: Description: A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x80090016.
這個事件或錯誤表示取得憑證的私鑰時發生問題。 因此,請嘗試下列步驟來解決警告:
首先,確認 MachineKeys 資料夾的許可權。 所有的私鑰都會儲存在 MachineKeys 資料夾中,因此請確定您擁有必要的許可權。
如果許可權已就緒,且問題仍未修正,則憑證可能會有問題。 它可能已損毀。 您可能會在下列 SChannel 事件記錄檔中看到0x8009001a的錯誤碼:
Event Type: Error Event Source: Schannel Event Category: None Event ID: 36870 Date: 2/11/2012 Time: 12:44:55 AM User: N/A Computer: A fatal error occurred when attempting to access the SSL server credential private key. The error code returned from the cryptographic module is 0x8009001a.
檢查網站是否使用測試憑證。
取得現有憑證的備份,然後將它取代為自我簽署憑證。
嘗試使用 HTTPS 存取網站。 如果運作正常,則先前使用的憑證已損毀,且必須取代為新的工作憑證。 有時候,問題可能不是憑證,而是與簽發者。 您可能會在 SSLDiag 中看到下列錯誤:
CertVerifyCertificateChainPolicy
如果根 CA 憑證不受信任,將會失敗CERT_E_UNTRUSTEDROOT (0x800b0109)
。若要修正此錯誤,請將 CA 的憑證新增至伺服器上的 [我的電腦帳戶] 底下的「受信任的根 CA」存放區。 您也可以收到下列錯誤:
CertVerifyCertificateChainPolicy 傳回錯誤 -2146762480(0x800b0110)。
若要解決錯誤,請執行下列步驟來檢查憑證的使用類型:
- 開啟憑證。
- 選取 [詳細資料] 索引標籤。
- 選取 [編輯屬性]。
- 在 [一般] 索引標籤下,確定 已選取 [啟用此憑證 的所有用途] 選項,而且最重要的是, 伺服器驗證 應該會出現在清單中。
案例 3
前兩個案例有助於檢查憑證的完整性。 確認憑證沒有任何問題之後,就會解決大小問題。 但是,如果網站仍然無法透過 HTTPS 存取,該怎麼辦? 檢查網站的 HTTPS 系結,並判斷其正在接聽的埠和 IP。
解決方法
執行下列命令,以確定網站所使用的 SSL 埠上沒有其他進程正在接聽。
netstat -ano" or "netstat -anob
如果有另一個進程接聽該埠,請檢查該進程為何使用該埠。
請嘗試變更IP-Port組合,以檢查網站是否可存取。
案例 4
現在,您可以確定已在網站上安裝適當的工作憑證,而且沒有其他程式使用此網站的 SSL 埠。 不過,在透過 HTTPS 存取網站時,您可能會看到「無法顯示頁面」錯誤。 當用戶端連線並起始 SSL 交涉時, HTTP.sys搜尋 其 SSL 組態,以尋找用戶端所連線的「IP:Port」組。 HTTP.sys SSL 組態必須包含憑證哈希和證書存儲的名稱,SSL 交涉才會成功。 問題可能是。HTTP.SYS SSL Listener
向 HTTP.sys 註冊的憑證哈希可能是 NULL,也可能包含無效的 GUID。
解決方法
執行以下 命令:
IIS 6: "httpcfg.exe query ssl" IIS 7/7.5: "netsh http show ssl"
注意
HttpCfg 是 Windows 支援工具的一部分,且存在於安裝磁碟上。
以下是工作和非工作案例的範例:
工作案例
設定 設定 IP 0.0.0.0:443 雜湊 c09b416d6b 8d615db22 64079d15638e96823d Guid {4dc3e181-e14b-4a21-b022-59fc669b0914} CertStoreName MY CertCheckMode 0 RevocationFreshnessTime 0 UrlRetrievalTimeout 0 SslCtlIdentifier 0 SslCtlStoreName 0 旗標 0 非工作案例
設定 設定 IP 0.0.0.0:443 雜湊 Guid {00000000-0000-0000-0000-000000000000} CertStoreName MY CertCheckMode 0 RevocationFreshnessTime 0 UrlRetrievalTimeout 0 SslCtlIdentifier 0 SslCtlStoreName 0 旗標 0 工作案例中所見的哈希值是 SSL 憑證的指紋。 請注意,在非工作案例中,GUID 全都是零。 您可能會看到哈希有一些值或空白。 即使您從網站移除憑證,然後執行
httpcfg query ssl
,網站仍會將 GUID 列為所有 0。 如果您看到 GUID 為 “{0000...............000}”,則發生問題。執行下列命令來移除這個專案:
httpcfg delete ssl -i "IP:Port Number"
例如:
httpcfg delete ssl -i 0.0.0.0:443
若要判斷是否列出任何 IP 位址,請開啟命令提示字元,然後執行下列命令:
IIS 6: httpcfg query iplisten
IIS 7/7.5: netsh http show iplisten
如果IP接聽清單是空的,命令會傳回下列字串:
HttpQueryServiceConfiguration completed with 1168.
如果命令傳回 IP 位址清單,請使用下列命令移除清單中的每個 IP 位址:
httpcfg delete iplisten -i x.x.x.x
注意
使用
net stop http /y
命令重新啟動 IIS。
案例 5
儘管如此,如果您仍然無法在 HTTPS 上瀏覽網站,請從用戶端或伺服器擷取網路追蹤。 依 「SSL 或 TLS」 篩選追蹤,以查看 SSL 流量。
以下是非工作案例的網路追蹤快照集:
以下是工作案例的網路追蹤快照集:
這是您查看網路追蹤的方法。 您需要展開框架詳細數據,並查看伺服器選擇的通訊協定和加密。 從描述中選取 「Server Hello」,以檢視這些詳細數據。
在非工作案例中,用戶端已設定為僅使用 TLS 1.1 和 TLS 1.2。 不過,網頁伺服器是 IIS 6,可支援直到 TLS 1.0 為止,因此交握失敗。
檢查登錄機碼,以判斷哪些通訊協定已啟用或停用。 以下是路徑:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
“Enabled” DWORD 應該設定為 “1”。 如果設定為 0,則會停用通訊協定。
例如,預設會停用SSL 2.0。
案例 6
如果所有專案都經過驗證,而且您仍然遇到透過 HTTPS 存取網站的問題,則很可能是一些更新,這會導致 SSL 交握失敗。
Microsoft已發行 Windows 中 SSL 實作的更新:
MS12-006: Vulnerability in SSL/TLS could allow information disclosure: January 10, 2012
此更新可能會影響使用 Internet Explorer 的客戶,或使用使用 Internet Explorer 執行 HTTPS 要求的應用程式。
實際上,SSL 3.0 / TLS 1.0 中已對資訊洩漏弱點進行兩項變更。 MS12-006 更新會在用戶端要求該行為時,在 schannel.dll 中實作新的行為,此行為會在用戶端要求該行為時,使用一般 SSL 鏈結區塊加密來傳送額外的記錄。 另一項變更是在 Wininet.dll,這是 Internet Explorer 12 月累積更新 (MS11-099) 的一部分,因此 Internet Explorer 會要求新的行為。
如果問題存在,它可能會顯示為無法連線到伺服器或不完整的要求。 Internet Explorer 9 和更新版本能夠顯示「Internet Explorer 無法顯示網頁」錯誤。 舊版 Internet Explorer 可能會顯示空白頁面。
Fiddler 在擷取 HTTPS 要求並將其轉送至伺服器時,不會使用額外的記錄。 因此,如果使用 Fiddler 來擷取 HTTPS 流量,要求將會成功。
登錄機碼
如 MS12-006 中所述 :SSL/TLS 中的弱點可能會允許資訊洩漏:2012 年 1 月 10 日,有 SendExtraRecord 登錄值,可以:
- 全域停用新的 SSL 行為,
- 全域啟用它,或
- (根據預設)為選擇新行為的 SChannel 用戶端啟用它。
對於 Internet Explorer 和取用 Internet Explorer 元件的用戶端,FeatureControl 區段中有一個登錄機碼,FEATURE_SCH_SEND_AUX_RECORD_KB_2618444,這會決定iexplore.exe或任何其他具名應用程式選擇新的行為。 根據預設,這會針對 Internet Explorer 啟用,並針對其他應用程式停用。