

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何遷移和部署 AWS Encryption SDK
<a name="migration-guide"></a>

從 1.7.*x* 以前的 AWS Encryption SDK 版本遷移至 2.0.*x* 或更新版本時，您必須安全地轉換為使用[金鑰承諾](concepts.md#key-commitment)加密。否則，您的應用程式將遇到無法解密的加密文字。如果您使用的是 AWS KMS 主金鑰提供者，則必須更新為以嚴格模式或探索模式建立主金鑰提供者的新建構函式。

**注意**  
本主題專為從舊版 遷移 AWS Encryption SDK 至 2.0.*x* 版或更新版本的使用者而設計。如果您是初次使用 AWS Encryption SDK，您可以使用預設設定立即開始使用最新的可用版本。

為了避免您無法解密您需要讀取之加密文字的嚴重情況，建議您在多個不同階段遷移和部署。在開始下一個階段之前，請確認每個階段都已完成並完全部署。這對具有多個主機的分散式應用程式特別重要。

## 階段 1：將您的應用程式更新至最新的 1.*x* 版本
<a name="migrate-stage1"></a>

為您的程式設計語言更新至最新的 1.*x* 版本。在開始階段 2 之前，請仔細測試、部署變更，並確認更新已傳播至所有目的地主機。

**重要**  
確認您最新的 1.*x* 版本是 1.7.*x* 或更新版本 AWS Encryption SDK。

最新的 1.*x* 版本 AWS Encryption SDK 與舊版 回溯相容， AWS Encryption SDK 且與 2.0.*x* 版及更新版本向前相容。它們包含 2.0.*x* 版中存在的新功能，但包含專為此遷移設計的安全預設值。它們可讓您視需要升級 AWS KMS 主金鑰提供者，並使用演算法套件完整部署，這些套件可透過金鑰承諾解密加密文字。
+ 取代已取代的元素，包括舊版 AWS KMS 主金鑰提供者的建構函式。在 [Python](https://docs.python.org/3/library/warnings.html) 中，請務必開啟棄用警告。在最新的 1.*x* 版本中取代的程式碼元素會從 2.0.*x* 版和更新版本中移除。
+ 明確將您的承諾政策設定為 `ForbidEncryptAllowDecrypt`。雖然這是最新 1.*x* 版本中唯一有效的值，但當您使用此版本中介紹APIs 時，需要此設定。當您遷移至 2.0.*x* 版和更新版本時，它可防止應用程式拒絕在沒有金鑰承諾的情況下加密的加密文字。如需詳細資訊，請參閱[設定您的承諾政策](migrate-commitment-policy.md)。
+ 如果您使用 AWS KMS 主金鑰提供者，則必須將舊版主金鑰提供者更新為支援*嚴格模式*和*探索模式*的主金鑰提供者。 適用於 JAVA 的 AWS Encryption SDK 適用於 Python 的 AWS Encryption SDK、 和 AWS Encryption CLI 需要此更新。如果您在探索模式中使用主金鑰提供者，我們建議您實作探索篩選條件，將所使用的包裝金鑰限制在那些金鑰 AWS 帳戶。此更新是選用的，但我們建議採用[最佳實務](best-practices.md)。如需詳細資訊，請參閱[更新 AWS KMS 主金鑰提供者](migrate-mkps-v2.md)。
+ 如果您使用[AWS KMS 探索 keyring](use-kms-keyring.md#kms-keyring-discovery)，我們建議您包含探索篩選條件，將解密中使用的包裝金鑰限制為特定 的金鑰 AWS 帳戶。此更新是選用的，但我們建議採用[最佳實務](best-practices.md)。如需詳細資訊，請參閱[更新 AWS KMS keyring](migrate-keyrings-v2.md)。

## 階段 2：將您的應用程式更新至最新版本
<a name="migrate-stage2"></a>

成功將最新的 1.*x* 版本部署到所有主機後，您可以升級至 2.0.*x* 版和更新版本。2.0.*x* 版包含所有舊版 的重大變更。 AWS Encryption SDK不過，如果您進行第 1 階段中建議的程式碼變更，則可以避免在遷移至最新版本時發生錯誤。

在更新至最新版本之前，請確認您的承諾政策一致地設定為 `ForbidEncryptAllowDecrypt`。然後，根據您的資料組態，您可以按照自己的步調遷移至 `RequireEncryptAllowDecrypt` ，然後遷移至預設設定 `RequireEncryptRequireDecrypt`。我們建議一系列的轉換步驟，如下所示模式。

1. 從您的[承諾政策](migrate-commitment-policy.md)設定為 開始`ForbidEncryptAllowDecrypt`。 AWS Encryption SDK 可以使用金鑰承諾解密訊息，但尚未使用金鑰承諾加密。

1. 當您準備好時，請將您的承諾政策更新為 `RequireEncryptAllowDecrypt`。會透過[金鑰承諾](concepts.md#key-commitment) AWS Encryption SDK 開始加密您的資料。它可以使用和不使用金鑰承諾來解密加密文字。

   將承諾政策更新至 之前`RequireEncryptAllowDecrypt`，請確認您的最新 1.*x* 版本已部署至所有主機，包括解密您產生之加密文字的任何應用程式的主機。1.7.*x* 版 AWS Encryption SDK 之前的 版本無法解密以金鑰承諾加密的訊息。

   這也是將指標新增至應用程式的好時機，以測量您是否仍在處理加密文字，而無需金鑰承諾。這將協助您判斷何時可安全地將承諾政策設定更新為 `RequireEncryptRequireDecrypt`。對於某些應用程式，例如在 Amazon SQS 佇列中加密訊息的應用程式，這可能表示等待足夠長的時間，以舊版本加密的所有加密文字都已重新加密或刪除。對於其他應用程式，例如加密的 S3 物件，您可能需要下載、重新加密和重新上傳所有物件。

1. 當您確定沒有在沒有金鑰承諾的情況下加密任何訊息時，您可以將承諾政策更新為 `RequireEncryptRequireDecrypt`。此值可確保您的資料一律使用金鑰承諾進行加密和解密。此設定是預設值，因此您不需要明確設定，但我們建議您這麼做。明確的設定將有助於[偵錯](troubleshooting-migration.md)，以及在應用程式遇到加密文字時無需金鑰承諾而可能需要的任何潛在轉返。