

• AWS Systems Manager CloudWatch 控制面板在 2026 年 4 月 30 日之后将不再可用。客户可以像现在一样继续使用 Amazon CloudWatch 控制台来查看、创建和管理其 Amazon CloudWatch 控制面板。有关更多信息，请参阅 [Amazon CloudWatch 控制面板文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)。

# AWS Systems Manager Parameter Store SecureString 参数的 AWS KMS 加密
<a name="secure-string-parameter-kms-encryption"></a>

借助 AWS Systems Manager Parameter Store，您可以创建 [SecureString 参数](https://docs.aws.amazon.com//systems-manager/latest/userguide/systems-manager-parameter-store.html#what-is-a-parameter)，这些参数具有明文参数名称和加密的参数值。Parameter Store 使用 AWS KMS 加密和解密 `SecureString` 参数的参数值。

借助 Parameter Store，您可以创建、存储和管理数据作为具有值的参数。您可以在 Parameter Store 中创建一个参数，然后在多个受您设计的策略和权限限制的应用程序和服务中使用该参数。在需要更改参数值时，您可以更改一个实例，而不是管理对众多源进行的更改，后者很容易出错。Parameter Store 支持参数名称采用分层结构，因此，您可以将某个参数限制为用于特定的用途。

要管理敏感数据，您可以创建 `SecureString` 参数。在创建或更改 `SecureString` 参数的参数值时，Parameter Store 使用 AWS KMS keys 来加密这些参数值。在访问这些参数值时，它也使用 KMS 密钥解密这些值。您可以使用 Parameter Store 为您的账户创建的 [AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)，或者指定您自己的[客户自主管理型密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

**重要**  
Parameter Store 仅支持[对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-choose-key-spec.html#symmetric-cmks)。不能使用[非对称 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html)来加密您的参数。如需帮助确定 KMS 密钥是对称的还是非对称的，请参阅《*AWS Key Management Service 开发人员指南*》中的[识别不同的密钥类型](https://docs.aws.amazon.com/kms/latest/developerguide/identify-key-types.html)。

Parameter Store 支持两个级别的`SecureString`参数：*标准* 和*高级*，不能超过 4096 字节的标准参数直接在指定的 KMS 密钥下进行加密和解密。为了加密和解密高级`SecureString`参数，Parameter Store 将信封加密与 [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/)结合使用。您可以将标准`SecureString`参数转换为高级参数，但不能将高级参数转换为标准参数。有关标准和高级 `SecureString` 参数之间的差异的更多信息，请参阅[管理参数层](parameter-store-advanced-parameters.md)。

**Topics**
+ [保护标准 SecureString 参数](#kms-encryption-securestring-standard)
+ [保护高级 SecureString 参数](#kms-encryption-securestring-advanced)
+ [设置权限以加密和解密参数值](#parameter-policy-kms-encryption)
+ [Parameter Store 加密上下文](#parameter-store-kms-encryption-context)
+ [排查 Parameter Store 中的 KMS 密钥问题](#parameter-store-kms-cmk-troubleshooting)

## 保护标准 SecureString 参数
<a name="kms-encryption-securestring-standard"></a>

Parameter Store 不执行任何加密操作。相反，它依赖于 AWS KMS 加密和解密`SecureString`参数值。在创建或更改标准`SecureString`参数值时，Parameter Store 会调用 AWS KMS [Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 操作。该操作直接使用对称加密 KMS 密钥加密参数值，而不是使用 KMS 密钥生成[数据密钥](https://docs.aws.amazon.com/kms/latest/developerguide/data-keys.html)。

您可以选择 Parameter Store 用于加密参数值的 KMS 密钥。如果未指定 KMS 密钥，Parameter Store 会使用 Systems Manager 在您的账户中自动创建的 AWS 托管式密钥。此 KMS 密钥具有 `aws/ssm` 别名。

要查看您的账户的默认 `aws/ssm` KMS 密钥，请使用 AWS KMS API 中的 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 操作。以下示例在别名为 `describe-key` 的 AWS Command Line Interface (AWS CLI) 中使用 `aws/ssm` 命令。

```
aws kms describe-key \
    --key-id alias/aws/ssm
```

要创建标准 `SecureString` 参数，请使用 Systems Manager API 中的 [PutParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutParameter.html) 操作。省略 `Tier` 参数或指定 `Standard` 的值（它是默认值）。请包含具有 `SecureString` 值的 `Type` 参数。要指定 KMS 密钥，请使用 `KeyId` 参数。默认值为您的账户的 AWS 托管式密钥，即 `aws/ssm`。

然后，Parameter Store 使用 KMS 密钥和明文参数值调用 AWS KMS `Encrypt` 操作。AWS KMS 返回加密的参数值，Parameter Store 会将该值与参数名称一起存储。

以下示例在 AWS CLI 中使用 Systems Manager [put-parameter](https://docs.aws.amazon.com/cli/latest/reference/ssm/put-parameter.html) 命令及其 `--type` 参数来创建 `SecureString` 参数。由于该命令省略了可选的 `--tier` 和 `--key-id` 参数，因此，Parameter Store 将创建标准 `SecureString` 参数，并在 AWS 托管式密钥下对其进行加密。

```
aws ssm put-parameter \
    --name MyParameter \
    --value "secret_value" \
    --type SecureString
```

以下类似的示例使用 `--key-id` 参数指定[客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。该示例使用 KMS 密钥 ID 标识 KMS 密钥，但您可以使用任何有效的 KMS 密钥标识符。由于该命令省略 `Tier` 参数 (`--tier`)，因此，Parameter Store 将创建标准`SecureString`参数而非高级参数。

```
aws ssm put-parameter \
    --name param1 \
    --value "secret" \
    --type SecureString \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
```

在从 Parameter Store 获取`SecureString`参数时，将对其值进行加密。要获取参数，请使用 Systems Manager API 中的 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) 操作。

以下示例在 AWS CLI 中使用 Systems Manager [get-parameter](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameter.html) 命令从 Parameter Store 中获取 `MyParameter` 参数，而不解密其值。

```
aws ssm get-parameter --name MyParameter
```

```
{
    "Parameter": {
        "Type": "SecureString", 
        "Name": "MyParameter", 
        "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg"
    }
}
```

要在返回之前解密参数值，请将 `GetParameter` 的 `WithDecryption` 参数设置为 `true`。在使用 `WithDecryption` 时，Parameter Store 代表您调用 AWS KMS [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作以解密该参数值。因此，`GetParameter` 请求返回参数以及明文参数值，如以下示例中所示。

```
aws ssm get-parameter \
    --name MyParameter \
    --with-decryption
```

```
{
    "Parameter": {
        "Type": "SecureString", 
        "Name": "MyParameter", 
        "Value": "secret_value"
    }
}
```

以下工作流演示 Parameter Store 如何使用 KMS 密钥来加密和解密标准 `SecureString` 参数。

### 加密标准参数
<a name="kms-encryption-securestring-standard-encrypt"></a>

1. 在使用 `PutParameter` 创建 `SecureString` 参数时，Parameter Store 将向 AWS KMS 发送 `Encrypt` 请求。该请求包含明文参数值、您选择的 KMS 密钥和 [Parameter Store 加密上下文](#parameter-store-kms-encryption-context)。在传输到 AWS KMS 期间，将通过传输层安全性 (TLS) 保护`SecureString`参数中的明文值。

1. AWS KMS 使用指定的 KMS 密钥和加密上下文来加密参数值。它将密文返回到 Parameter Store，后者将存储参数名称及其加密值。  
![\[加密标准 SecureString 参数值\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/service-pstore-standard.png)

### 解密标准参数
<a name="kms-encryption-securestring-standard-decrypt"></a>

1. 当您在 `GetParameter` 请求中包含 `WithDecryption` 参数时，Parameter Store 会向 AWS KMS 发送包含加密的 `SecureString` 参数值和 [Parameter Store 加密上下文](#parameter-store-kms-encryption-context)的 `Decrypt` 请求。

1. AWS KMS 使用相同的 KMS 密钥和提供的加密上下文来解密加密的值。它向 Parameter Store 返回明文（解密的）参数值。在传输期间，将通过 TLS 保护明文数据。

1. Parameter Store 在 `GetParameter` 响应中向您返回明文参数值。

## 保护高级 SecureString 参数
<a name="kms-encryption-securestring-advanced"></a>

当您使用 `PutParameter` 创建高级 `SecureString` 参数时，Parameter Store 会使用[信封加密](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/how-it-works.html#envelope-encryption)与 AWS Encryption SDK 和对称加密 AWS KMS key来保护参数值。每个高级参数值都使用唯一数据密钥加密，数据密钥使用 KMS 密钥加密。您可以将 [AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 用于账户 (`aws/ssm`) 或任何客户托管密钥。

[AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/) 是一个开源客户端库，可帮助您使用行业标准和最佳实践来加密和解密数据。它在多个平台上受支持并支持多种编程语言，包括命令行界面。您可以在 GitHub 中查看源代码并加入源代码的开发工作。

对于每个`SecureString`参数值，Parameter Store 调用 AWS Encryption SDK 以使用 AWS KMS 生成的唯一数据密钥 ([GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)) 来加密参数值。AWS Encryption SDK 向 Parameter Store 返回一条[加密消息](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#message)（其中包含加密参数值）和唯一数据密钥的加密副本。Parameter Store 将整个加密消息存储在`SecureString`参数值中。之后，在您获取高级`SecureString`参数值时，Parameter Store 使用 AWS Encryption SDK 解密参数值。这需要调用 AWS KMS 以解密加密的数据密钥。

要创建高级 `SecureString` 参数，请使用 Systems Manager API 中的 [PutParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutParameter.html) 操作。将 `Tier` 参数的值设置为 `Advanced`。请包含具有 `SecureString` 值的 `Type` 参数。要指定 KMS 密钥，请使用 `KeyId` 参数。默认值为您的账户的 AWS 托管式密钥，即 `aws/ssm`。

```
aws ssm put-parameter \
    --name MyParameter \
    --value "secret_value" \
    --type SecureString \
    --tier Advanced
```

以下类似的示例使用 `--key-id` 参数指定[客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。此示例使用 KMS 密钥的 Amazon Resource Name (ARN)，但您可以使用任何有效的 KMS 密钥标识符。

```
aws ssm put-parameter \
    --name MyParameter \
    --value "secret_value" \
    --type SecureString \
    --tier Advanced \
    --key-id arn:aws:kms:us-east-2:987654321098:key/1234abcd-12ab-34cd-56ef-1234567890ab
```

在从 Parameter Store 获取`SecureString`参数时，其值为 AWS Encryption SDK 所返回的加密消息。要获取参数，请使用 Systems Manager API 中的 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) 操作。

以下示例使用 Systems Manager `GetParameter` 操作从 Parameter Store 获取 `MyParameter` 参数，而不解密其值。

```
aws ssm get-parameter --name MyParameter
```

```
{
    "Parameter": {
        "Type": "SecureString", 
        "Name": "MyParameter", 
        "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg"
    }
}
```

要在返回之前解密参数值，请将 `GetParameter` 的 `WithDecryption` 参数设置为 `true`。在使用 `WithDecryption` 时，Parameter Store 代表您调用 AWS KMS [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作以解密该参数值。因此，`GetParameter` 请求返回参数以及明文参数值，如以下示例中所示。

```
aws ssm get-parameter \
    --name MyParameter \
    --with-decryption
```

```
{
    "Parameter": {
        "Type": "SecureString", 
        "Name": "MyParameter", 
        "Value": "secret_value"
    }
}
```

您无法将高级`SecureString`参数转换为标准参数，但可以将标准`SecureString`参数转换为高级参数。要将标准`SecureString`参数转换为高级`SecureString`参数，请将 `PutParameter` 操作与 `Overwrite` 参数结合使用。`Type` 必须为 `SecureString`，并且 `Tier` 值必须为 `Advanced`。`KeyId` 参数（它标识客户托管密钥）是可选的。如果省略此参数，Parameter Store 将使用该账户的 AWS 托管式密钥。您可以指定委托人有权使用的任何 KMS 密钥，即使您使用不同的 KMS 密钥来加密标准参数也是如此。

当您使用 `Overwrite` 参数时，Parameter Store 使用 AWS Encryption SDK 加密参数值。然后，它会将新加密的消息存储在 Parameter Store 中。

```
aws ssm put-parameter \
    --name myStdParameter \
    --value "secret_value"  \
    --type SecureString \
    --tier Advanced \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --overwrite
```

以下工作流介绍 Parameter Store 如何使用 KMS 密钥来加密和解密高级 `SecureString` 参数。

### 加密高级参数
<a name="kms-encryption-securestring-advanced-encrypt"></a>

1. 当您使用 `PutParameter` 创建高级 `SecureString` 参数时，Parameter Store 会使用 AWS Encryption SDK 和 AWS KMS 加密参数值。Parameter Store 调用带参数值的 AWS Encryption SDK、您指定的 KMS 密钥以及 [Parameter Store 加密上下文](#parameter-store-kms-encryption-context)。

1. AWS Encryption SDK 使用您指定的 KMS 密钥的标识符和 Parameter Store 加密上下文向 AWS KMS 发送 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)。AWS KMS 返回唯一数据密钥的两个副本：一个是明文形式，一个使用 KMS 密钥进行了加密。（加密数据密钥时将使用加密上下文。）

1. AWS Encryption SDK 使用明文数据密钥对参数值进行加密。它返回一条[加密消息](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#message)，其中包含加密的参数值、加密的数据密钥和其他数据（包括 Parameter Store 加密上下文）。

1. Parameter Store 将加密消息存储为参数值。  
![\[加密高级 SecureString 参数值\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/service-pstore-advanced.png)

### 解密高级参数
<a name="kms-encryption-securestring-advanced-decrypt"></a>

1. 您可以将 `WithDecryption` 参数包含在 `GetParameter` 请求中以获取高级`SecureString`参数。在执行此操作时，Parameter Store 将[加密消息](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#message)从参数值传递到 AWS Encryption SDK 的解密方法。

1. AWS Encryption SDK 调用 AWS KMS [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作。它传入加密消息中的加密的数据密钥和 Parameter Store 加密上下文。

1. AWS KMS 使用 KMS 密钥和 Parameter Store 加密上下文来解密加密的数据密钥。然后，它向 AWS Encryption SDK 返回明文（解密的）数据密钥 。

1. AWS Encryption SDK 使用明文数据密钥对参数值进行解密。它向 Parameter Store 返回明文参数值。

1. Parameter Store 验证您的加密上下文，并在 `GetParameter` 响应中向您返回明文参数值。

## 设置权限以加密和解密参数值
<a name="parameter-policy-kms-encryption"></a>

要加密标准`SecureString`参数值，用户需要 `kms:Encrypt` 权限。要加密高级`SecureString`参数值，用户需要 `kms:GenerateDataKey` 权限。要解密任一类型的`SecureString`参数值，用户需要 `kms:Decrypt` 权限。

您可以使用 AWS Identity and Access Management (IAM) 策略来允许或拒绝用户调用 Systems Manager `PutParameter` 和 `GetParameter` 操作的权限。

如果使用客户自主管理型密钥来加密您的 `SecureString` 参数值，则可以使用 IAM 策略和密钥政策来管理加密和解密权限。不过，您无法为默认的 `aws/ssm` KMS 密钥制定访问控制策略。有关如何控制对客户自主管理型密钥的访问权限的详细信息，请参阅《*AWS Key Management Service 开发人员指南*》中的[KMS密钥访问和权限](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

以下示例展示了为标准 `SecureString` 参数设计的 IAM 策略。此策略允许用户对 `FinancialParameters` 路径中的所有参数调用 Systems Manager `PutParameter` 操作。此策略还允许用户对示例客户托管密钥调用 AWS KMS `Encrypt` 操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:PutParameter"
            ],
            "Resource": "arn:aws:ssm:us-east-1:111122223333:parameter/FinancialParameters/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

下一个示例展示了为高级 `SecureString` 参数设计的 IAM 策略。此策略允许用户对 `ReservedParameters` 路径中的所有参数调用 Systems Manager `PutParameter` 操作。此策略还允许用户对示例客户托管密钥调用 AWS KMS `GenerateDataKey` 操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:PutParameter"
            ],
            "Resource": "arn:aws:ssm:us-east-1:111122223333:parameter/ReservedParameters/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id"
        }
    ]
}
```

------

最后一个示例还显示了一个 IAM 策略，该策略可用于标准或高级`SecureString`参数。此策略允许用户对 `ITParameters` 路径中的所有参数调用 Systems Manager `GetParameter` 操作（以及相关操作）。此策略还允许用户对示例客户托管密钥调用 AWS KMS `Decrypt` 操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter*"
            ],
            "Resource": "arn:aws:ssm:us-east-1:111122223333:parameter/ITParameters/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

## Parameter Store 加密上下文
<a name="parameter-store-kms-encryption-context"></a>

*加密上下文* 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时，AWS KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据，您必须传入相同的加密上下文。

您还可以使用加密上下文在审核记录和日志中识别加密操作。加密上下文在日志中以明文形式显示，例如，[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 日志。

虽然 AWS Encryption SDK 也接受加密上下文，但它以不同方式处理该上下文。Parameter Store 向加密方法提供加密上下文。AWS Encryption SDK 以加密方式将加密上下文绑定到加密数据。它还以明文形式将加密上下文包含在其返回的加密消息的标头中。但与 AWS KMS 不同，AWS Encryption SDK 解密方法不将加密上下文作为输入。相反，在解密数据时，AWS Encryption SDK 将获取加密消息中的加密上下文。Parameter Store 验证加密上下文是否包含在将明文参数值返回给您之前所期望的值。

Parameter Store 在加密操作中使用以下加密上下文：
+ 键：`PARAMETER_ARN`
+ 值：要加密的参数的 Amazon Resource Name (ARN)。

加密上下文的格式如下所示：

```
"PARAMETER_ARN":"arn:aws:ssm:region-id:account-id:parameter/parameter-name"
```

例如，Parameter Store 在调用中包含此加密上下文，以在示例 AWS 账户和区域中加密和解密 `MyParameter` 参数。

```
"PARAMETER_ARN":"arn:aws:ssm:us-east-2:111122223333:parameter/MyParameter"
```

如果该参数位于 Parameter Store 分层路径中，则在加密上下文中包含路径和名称。例如，在示例 AWS 账户 和区域中加密和解密 `/ReadableParameters` 路径中的 `MyParameter` 参数时，将使用此加密上下文。

```
"PARAMETER_ARN":"arn:aws:ssm:us-east-2:111122223333:parameter/ReadableParameters/MyParameter"
```

您可以通过使用正确的加密上下文和 Systems Manager `GetParameter` 操作返回的加密参数值调用 AWS KMS `Decrypt` 操作来解密加密的 `SecureString` 参数值。不过，我们建议您将 `GetParameter` 操作与 `WithDecryption` 参数一起使用以解密 Parameter Store 参数值。

您还可以在 IAM policy 中包含加密上下文。例如，您可以允许用户仅解密某个特定参数值或一组参数值。

以下示例 IAM policy 语句允许用户获取 `MyParameter` 参数值，以及使用指定的 KMS 密钥解密该参数值。不过，只有在加密上下文与指定的字符串匹配时，这些权限才适用。这些权限不适用于任何其他参数或 KMS 密钥；如果加密上下文与该字符串不匹配，对 `GetParameter` 的调用将失败。

在使用类似于此的策略语句之前，请将*示例 ARN* 替换为有效值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter*"
            ],
            "Resource": "arn:aws:ssm:us-east-1:111122223333:parameter/MyParameter"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:PARAMETER_ARN":"arn:aws:ssm:us-east-1:111122223333:parameter/MyParameter"
                }
            }
        }
    ]
}
```

------

## 排查 Parameter Store 中的 KMS 密钥问题
<a name="parameter-store-kms-cmk-troubleshooting"></a>

要对 `SecureString` 参数执行任何操作，Parameter Store 必须能够使用您为预期操作指定的 AWS KMS KMS 密钥。与 KMS 密钥相关的大多数 Parameter Store 失败都是由以下问题造成的：
+ 应用程序使用的凭证无权对 KMS 密钥执行指定的操作。

  要修复该错误，请使用不同的凭证运行应用程序，或者修改妨碍执行该操作的 IAM 或密钥策略。有关 AWS KMS IAM 和密钥政策的帮助，请参阅《*AWS Key Management Service 开发人员指南*》中的 [KMS 密钥访问和权限](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。
+ 找不到 KMS 密钥。

  在 KMS 密钥使用不正确的标识符时，通常会发生这种情况。请[查找 KMS 密钥的正确标识符](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html)，然后重试该命令。
+ KMS 密钥未启用。在发生这种情况时，Parameter Store 返回 InvalidKeyId 异常，并包含来自 AWS KMS 的详细错误消息。如果 KMS 密钥状态为 `Disabled`，请[启用它](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)。如果状态为 `Pending Import`，请完成[导入过程](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)。如果密钥状态为 `Pending Deletion`，请[取消密钥删除](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys-scheduling-key-deletion.html)或使用不同的 KMS 密钥。

  要查找 KMS 密钥的[密钥状态](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)，请使用 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 操作。