當您連線到 SQL Server 時,「從遠端伺服器收到的憑證是由不受信任的證書頒發機構單位發出」錯誤

原始產品版本:SQL Server
原始 KB 編號: 2007728

總結

本文將協助你解決「從遠端伺服器收到的憑證由不受信任的憑證授權機構發出」這個錯誤,該錯誤發生在用戶端與 SQL Server 進行加密(TLS)連線時所發生。 此錯誤表示用戶端無法驗證 SQL Server 實例在 TLS 握手時所呈現的憑證,通常是因為發出憑證授權機構(CA)不在用戶端的受信任根憑證授權機構資料庫中,或是 SQL Server 使用自簽憑證。

你可以透過在用戶端電腦安裝發出的 CA 憑證、信任伺服器憑證而不驗證(信任 伺服器憑證 設定),或更改用戶端或伺服器的加密設定來解決這個錯誤。 最近版本的幾個客戶端驅動程式和工具預設值改成需要加密,所以即使伺服器沒變,你還是可能會在驅動程式或工具升級後看到這個錯誤。

徵兆

當您連接到 SQL Server 時,可能會收到以下錯誤訊息:

已順利建立與伺服器的連接,但隨後在登入過程中發生錯誤。 (提供者:SSL 提供者,錯誤:0 - 憑證鏈是由不受信任的授權單位發出。) (.Net SqlClient Data Provider)

此外,Windows 系統事件日誌中也會記錄以下錯誤訊息:

Log Name:      System  
Source:        Schannel  
Date:          10/13/2020 3:03:31 PM  
Event ID:      36882  
Task Category: None  
Level:         Error  
Keywords:  
User:        USERNAME  
Computer:     COMPUTERNAME  
Description:  
The certificate received from the remote server was issued by an untrusted certificate authority. Because of this, none of the data contained in the certificate can be validated. The TLS connection request has failed. The attached data contains the server certificate.

原因

這個錯誤發生在你使用客戶端無法驗證的憑證與 SQL Server 進行加密連線時。 這種行為發生在以下情境:

情境 伺服器端加密 用戶端加密 憑證類型 憑證核發授權單位位於受信任的根憑證授權單位存放區中
1 來自客戶端不信任來源的憑證(該授權機構未列在客戶端電腦的受信任根認證機構中)
2 SQL Server 產生的自簽憑證 不會。 自簽憑證不會出現在這個商店。

當用戶端建立與 SQL Server 的加密連線時,安全通道(Schannel)會透過搜尋本地電腦上的受信任根憑證授權機構儲存庫,建立受信任憑證授權機構的清單。 在 TLS 交握期間,伺服器會將其公開金鑰憑證傳送到用戶端。 公開金鑰憑證的發行者稱為憑證授權機構(CA)。 用戶端必須確認其信任該 CA,而它是透過預先知道受信任 CA 的公開金鑰來做到這一點。 當 Schannel 偵測到非受信任的認證機構發出的憑證時(如前兩種情境),你會在 症狀 區塊看到錯誤訊息。

若未設定或偵測到合適的憑證,資料庫引擎 會在啟動時產生自簽備用憑證。 它利用此憑證加密登入憑證,並在啟用伺服器端或用戶端加密時,對整個連線進行加密。 沒有客戶端預設信任自簽憑證,這也是為什麼即使客戶端和伺服器在同一台電腦上執行,預設安裝的 SQL Server 也可能發生此錯誤。 欲了解更多資訊,請參閱 登入封包加密與資料封包加密

為什麼這個錯誤會在驅動程式或工具升級後出現

下表中的客戶端驅動程式與工具版本已更改預設值,要求加密。 升級到這些版本後,客戶端會加密連線並驗證伺服器憑證,即使伺服器設定沒有改變。 早期版本預設不需要加密,所以除非你明確要求加密,否則憑證不會被驗證。

用戶端驅動程式或工具 版本 預設加密行為
Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL19 19及以後版本 Encrypt 預設為 Mandatory
適用於 SQL Server 的 Microsoft ODBC 驅動程式 18及以後版本 Encrypt 預設為 Mandatory
Microsoft.Data.SqlClient 4.0 及後續版本 Encrypt 預設為 True
SQL Server Management Studio (SSMS) 20 及以後版本 加密 預設為 強制加密

如果您在將應用程式從 SQL Server 原生客戶端 11.0(SNAC)遷移到 Microsoft OLE DB Driver 19 或 Microsoft ODBC Driver 18 後立即看到此錯誤,請參見驅動升級後不信任的憑證鏈

SNAC 不會隨 SQL Server 2022(16.x)及更新版本或 SSMS 19 及以後版本一起出貨,也不建議用於新開發。 請改用 Microsoft OLE DB Driver for SQL Server、Microsoft ODBC Driver for SQL Server 或 Microsoft.Data.SqlClient。 欲了解更多資訊,請參閱 SQL Server 原生客戶端的支援政策

解決方案

如果您有意使用非受信任權威的憑證或自簽憑證來加密與 SQL Server 的連線,請使用以下選項之一:

選項 1:在用戶端電腦上安裝憑證授權單位

針對情境 1,請將憑證授權單位新增至發起加密連線之用戶端電腦上的「受信任的根憑證授權單位」存放區。 為此,請完成步驟 1:將伺服器憑證匯出為檔案,步驟 2:依序在用戶端電腦安裝根憑證授權中心(CA)。

步驟 1:將伺服器憑證匯出為檔案

在 SQL Server 電腦上,將 SQL Server 使用的憑證匯出為檔案。 以下步驟以 caCert.cer 作為範例檔名。 這個檔案在您依照此步驟建立之前並不存在。 你選擇名字和地點。

  1. 選擇開始,輸入 mmc,然後開啟 Microsoft Management Console

  2. 選取檔案>新增/移除嵌入式管理單元

  3. 可用的嵌入式管理單元 清單中,選取 憑證,然後選取 新增

  4. 選擇 電腦帳號,選擇 下一步,選擇 本地電腦:(此主機運行的電腦),然後選擇 完成

    注意

    SQL Server 憑證安裝於本地電腦/個人憑證儲存庫中。 如果你選擇「我的使用者帳號」,MMC 會開啟另一個憑證庫,且 SQL Server 憑證不會出現。

  5. 選擇 確定 以關閉 新增或移除嵌入式管理單元 對話方塊。

  6. 在左側窗格,展開「憑證(本地電腦)」,展開「個人」,然後選擇「憑證」。

  7. 右鍵點擊 SQL Server 使用的憑證,然後選擇「所有任務>匯出」。

    Tip

    要辨識 SQL Server 使用的憑證,打開 SQL Server 組態管理員,展開 SQL Server 網路設定,右鍵點擊實例名稱>的<協定,選擇屬性,然後選擇憑證標籤。如果 SQL Server 錯誤日誌中包含「A self-generated certificate was loaded for encryption」的條目,SQL Server 會使用產生的備用憑證。 你無法匯出那張證書,所以改用 選項2選項3

  8. 選擇「下一步」以跳過憑證匯出嚮導「歡迎」頁面。

  9. 確認已選取 否,不要匯出私鑰,然後選取 下一步

  10. 請確認已選取 DER 編碼的二進位 X.509 (.CER)Base-64 編碼的 X.509 (.CER),然後選取 Next

  11. 輸入匯出檔名,例如 caCert.cer

  12. 選擇 「下一步」,然後選擇 「完成 」以匯出憑證。

  13. 把匯出的 .cer 檔案複製到用戶端電腦。

步驟 2:在用戶端電腦上安裝根憑證授權單位(CA)

  1. 在用戶端電腦上,開啟 MMC,選取 檔案>新增/移除嵌入式管理單元,在 可用的嵌入式管理單元 清單中選取 憑證,然後選取 新增

  2. 憑證嵌入式管理單元 對話方塊中,選取 電腦帳戶,然後選取 下一步

  3. 在 [選取計算機] 窗格中,選取 [本機計算機:[此控制台執行的計算機],然後選取 [完成]。

  4. 選擇 確定 以關閉 新增或移除嵌入式管理單元 對話方塊。

  5. 在 MMC 的左側窗格中,展開 憑證(本機電腦) 節點。

  6. 展開 受信任的根憑證授權單位 節點,以滑鼠右鍵按一下 憑證 子資料夾,選取 所有工作,然後選取 匯入

  7. 憑證匯入嚮導歡迎 頁面,選擇 「下一步」。

  8. 在 [要匯入的檔案] 頁面上,選取 [流覽]。

  9. 流覽至caCert.cer憑證檔案的位置,選取檔案,然後選取 [開啟]。

  10. 在 [要匯入的檔案] 頁面上,選取 [下一步]。

  11. 憑證存放區 頁面,接受預設選項,然後選取 下一步

  12. 完成憑證匯入精靈頁面上,選取完成

選項二:信任伺服器憑證但不驗證

對於情境 1 和 2,請在你的客戶端應用程式中設定 信任伺服器憑證(Trust Server Certificate )設定。 此設定保持連線加密,但跳過憑證驗證。 關鍵字名稱與接受值依客戶端函式庫而異:

用戶端程式庫 連線字串關鍵字
Microsoft.Data.SqlClient TrustServerCertificate=True
適用於 SQL Server 的 Microsoft ODBC 驅動程式 TrustServerCertificate=yes
Microsoft OLE DB Driver for SQL Server(提供者字串) TrustServerCertificate=yes
Microsoft OLE DB Driver for SQL Server(ADO 或 IDataInitialize Trust Server Certificate=true
適用於 SQL Server 的 Microsoft JDBC 驅動程式 trustServerCertificate=true

如果您使用 SQL Server Management Studio (SSMS) 20 或更新版本連接,請在「連接伺服器」對話框的登入頁面勾選信任伺服器憑證的核取方塊。 在較早期版本的 SSMS 中,請在「連接伺服器」視窗中選擇「選項」,選擇「連線屬性」標籤,然後選擇「信任伺服器憑證」。

如需更多關於如何為您的客戶端函式庫設定此設定的資訊,請參閱以下文章:

注意

信任伺服器憑證設定並沒有關閉加密功能。 連線保持加密,但用戶端不會驗證伺服器的身份。

注意事項

使用自簽憑證的加密連線並不提供強的安全性。 他們容易受到中間人攻擊。 在生產環境或連接網際網路的伺服器上,不要依賴帶有自簽憑證的 TLS。

選項三:更改加密設定

如果前述描述的配置是非預期的,請使用以下選項之一來解決此問題:

  • 設定 資料庫引擎 使用來自受信任權威機構的憑證。 此選項是最安全的長期解決方案,因為用戶端無需額外設定即可驗證憑證。 欲了解更多資訊,請參閱啟用 資料庫引擎 的加密連線SQL Server 憑證需求

  • 如果不需要加密:

    • 在你的客戶端應用程式中關閉加密。 將 Encrypt=Optional 設為 OLE DB 提供者字串,將 Use Encryption for Data=Optional 設為 OLE DB ADO 或 IDataInitialize,將 Encrypt=no 設為 ODBC,並將 Encrypt=False 設為 Microsoft.Data.SqlClient 或 Microsoft JDBC Driver。 在 SSMS 20 及更新版本中,請在連接伺服器對話框的登入頁面將加密設為可選

    • 請使用 SQL Server 組態管理員 關閉伺服器端加密。 展開 SQL Server 網路設定,右鍵點擊實例名稱>的<協定,選擇屬性,選擇旗標標籤,將強制加密設為「否」,然後重新啟動 SQL Server 服務。 欲了解更多資訊,請參閱 MSSQLSERVER 屬性協定(旗標標籤)。

      Warning

      如果你關閉加密,憑證和資料會在網路中不受保護地傳送。 只在受信任且隔離的網路上關閉加密。