為具有安全記憶體保護區的 Always Encrypted 進行常見問題疑難排解
適用於:SQL Server 2019 (15.x) 及更新版本 - 僅限 Windows Azure SQL 資料庫
本文描述如何在使用具有安全記憶體保護區的 Always Encrypted 執行 Transact-SQL (TSQL) 陳述式時,識別並解決可能發現的常見問題。
如需如何使用安全記憶體保護區執行查詢的資訊,請參閱使用安全記憶體保護區執行 Transact-SQL 陳述式。
資料庫連線錯誤
若要使用安全記憶體保護區執行陳述式,您必須啟用 Always Encrypted,指定資料庫連器的證明通訊協定和 (如果適用) 證明 URL,如使用安全記憶體保護區執行陳述式的必要條件所述。 不過,如果您指定證明通訊協定,但您的 Azure SQL Database 或目標 SQL Server 執行個體不支援安全記憶體保護區,或設定不正確,則連線會失敗。
- 如果您使用 Azure SQL Database 搭配 Intel SGX 記憶體保護區,請檢查您的資料庫是否使用 DC 系列硬體設定。 如需詳細資訊,請參閱為 Azure SQL 資料庫啟用 Intel SGX 記憶體保護區。
- 如果您使用 Azure SQL Database 搭配 VBS 記憶體保護區,請確認 preferredEnclaveType 資料庫屬性已設定為 VBS。 如需詳細資訊,請參閱為 Azure SQL 資料庫啟用 VBS 記憶體保護區。
- 如果您是使用 SQL Server 2019 (15.x) 或更新版本,請檢查執行個體是否已正確設定安全記憶體保護區。 如需詳細資訊,請參閱在 SQL Server 中設定安全的記憶體保護區。
使用 Microsoft Azure 證明時發生證明錯誤
注意
本節僅適用於具有 Intel SGX 記憶體保護區的 Azure SQL Database。
在用戶端驅動程式將 T-SQL 陳述式提交至 Azure SQL 邏輯伺服器執行之前,驅動程式會先使用 Microsoft Azure 證明觸發下列記憶體保護區證明工作流程。
- 用戶端驅動程式會將在資料庫連接中指定的證明 URL 傳遞至 Azure SQL 邏輯伺服器。
- Azure SQL 邏輯伺服器會收集記憶體保護區、其裝載環境和記憶體保護區內所執行程式碼的相關辨識項。 接著,伺服器會將證明要求傳送給證明 URL 所參考的證明提供者。
- 證明提供者會根據已設定的原則驗證辨識項,並向 Azure SQL 邏輯伺服器發出證明權杖。 證明提供者會用自己的私密金鑰簽署證明權杖。
- Azure SQL 邏輯伺服器會將證明權杖傳送給用戶端驅動程式。
- 用戶端會連絡指定證明 URL 中的證明提供者,以取得其公開金鑰,並驗證證明權杖中的簽章。
錯誤可能會在上述工作流程的各種步驟中發生,原因是設定不正確。 以下是常見的證明錯誤、其根本原因,以及建議的疑難排解步驟:
- 您的 Azure SQL 邏輯伺服器無法連線到在證明 URL 中所指定 Azure 證明的證明提供者 (上述工作流程的步驟 2)。 可能的原因包括:
- 證明 URL 不正確或不完整。 如需詳細資訊,請參閱判斷證明原則的證明 URL。
- 不小心刪除了證明提供者。
- 已針對證明提供者設定防火牆,但不允許存取 Microsoft 服務。
- 間歇網路錯誤造成無法使用證明提供者。
- Azure SQL 邏輯伺服器未獲授權,無法將證明要求傳送給證明提供者。 請確定證明提供者的系統管理員已將資料庫伺服器新增到證明讀取器角色。
- 證明原則驗證失敗 (上述工作流程的步驟 3)。
- 不正確的證明原則是可能的根本原因。 請確定正在使用 Microsoft 建議的原則。 如需詳細資訊,請參閱建立及設定證明提供者。
- 原則驗證也可能因為安全性缺口危害到伺服器端的記憶體保護區而失敗。
- 用戶端應用程式無法連線到證明提供者並擷取公開簽署金鑰 (步驟 5)。 可能的原因包括:
- 應用程式與證明提供者間的防火牆組態可能封鎖了連線。 若要對封鎖的連線進行疑難排解,請驗證您可否連線到證明提供者的 OpenId 端點。 例如,使用裝載應用程式的電腦網頁瀏覽器,查看可否連線至 OpenID 端點。 如需詳細資訊,請參閱中繼資料組態 - 取得 (機器翻譯)。
使用主機守護者服務時發生證明錯誤
注意
本節僅適用於 SQL Server 2019 (15.x) 和更新版本。
在用戶端驅動程式將 T-SQL 陳述式提交至 SQL Server 執行之前,驅動程式會先使用主機守護者服務 (HGS) 觸發下列記憶體保護區證明工作流程。
- 用戶端驅動程式會呼叫 SQL Server 以起始證明。
- SQL Server 會收集其記憶體保護區、裝載環境和記憶體保護區內所執行程式碼的相關辨識項。 SQL Server 會向 HGS 執行個體要求健康情況憑證,此執行個體即 SQL Server 裝載電腦的註冊對象。 如需詳細資訊,請參閱向主機守護者服務註冊電腦。
- HGS 會驗證辨識項,並向 SQL Server 核發健康情況憑證。 HGS 會使用自己的私密金鑰簽署健康情況憑證。
- SQL Server 會將健康情況憑證傳送至用戶端驅動程式。
- 用戶端驅動程式會連絡在證明 URL 中針對資料庫連接所指定的 HGS,以擷取 HGS 公開金鑰。 用戶端驅動程式會驗證健康情況憑證中的簽章。
因為組態不正確,上述工作流程的不同步驟中都可能發生錯誤。 以下是一些常見的證明錯誤、其根本原因,以及建議的疑難排解步驟:
- 因為發生間歇性的網路錯誤,所以 SQL Server 無法連線至 HGS (上述工作流程的步驟 2)。 若要針對連線問題進行疑難排解,SQL Server 電腦的系統管理員應該驗證電腦可否連線到 HGS 電腦。
- 步驟 3 的驗證失敗。 針對驗證問題進行疑難排解:
- SQL Server 的電腦系統管理員應該與用戶端應用程式的系統管理員合作,驗證 SQL Server 電腦是否已向和用戶端證明 URL 中所參考的同一 HGS 執行個體註冊。
- SQL Server 的電腦系統管理員應該遵循下列指示確認 SQL Server 電腦可成功證明,請見步驟 5:確認主機可以成功證明。
- 用戶端應用程式無法連線到 HGS 並擷取其公開簽署金鑰 (步驟 5)。 可能的原因是:
- 應用程式與證明提供者間的其中一個防火牆組態可能封鎖了連線。 請驗證裝載應用程式的電腦可否連線到 HGS 電腦。
就地加密錯誤
本節列出使用 ALTER TABLE
/ALTER COLUMN
進行就地加密時可能遇到的常見錯誤 (前面各節提過的證明錯誤之外)。 如需詳細資訊,請參閱使用具有安全記憶體保護區的 Always Encrypted 就地設定資料行加密。
- 您嘗試用以加密、解密或重新加密資料的資料行加密金鑰,不是已啟用記憶體保護區的金鑰。 如需就地加密必要條件的詳細資訊,請參閱必要條件。 若要如何佈建已啟用記憶體保護區金鑰的相關資訊,請參閱佈建已啟用記憶體保護區的金鑰。
- 您尚未針對資料庫連接啟用 Always Encrypted 和記憶體保護區計算。 請參閱使用安全記憶體保護區執行陳述式的必要條件。
ALTER TABLE
/ALTER COLUMN
陳述式會觸發密碼編譯作業,且會變更資料行資料類型,或使用與目前定序字碼頁不同的字碼頁設定定序。 不允許合併密碼編譯作業與資料類型或定序頁面變更。 為解決此問題,請使用個別的陳述式;一個陳述式變更資料類型或定序字碼頁,另一個陳述式進行就地加密。
使用安全記憶體保護區執行機密 DML 查詢時發生錯誤
本節列出使用安全記憶體保護區執行機密 DML 查詢時可能遇到的常見錯誤 (前面各節提過的證明錯誤之外)。
- 針對所要查詢資料行所設定的資料行加密金鑰,不是已啟用記憶體保護區的金鑰。
- 您尚未針對資料庫連接啟用 Always Encrypted 和記憶體保護區計算。 如需詳細資訊,請參閱使用安全記憶體保護區執行陳述式的必要條件。
- 您所要查詢的資料行使用確定性加密。 使用安全記憶體保護區的機密 DML 查詢不支援確定性加密。 如需如何將加密類型變更為隨機的詳細資訊,請參閱為現有加密資料行啟用具有安全記憶體保護區的 Always Encrypted。
- 您要查詢的字串資料行所使用定序非為 BIN2 或 UTF-8 定序。 請將定序變更為 BIN2 或 UTF-8。 如需詳細資訊,請參閱使用安全記憶體保護區的 DML 陳述式。
- 您的查詢觸發了未經支援操作。 如需在記憶體保護區內支援的作業清單,請參閱使用安全記憶體保護區的 DML 陳述式。