

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置密钥存储操作
<a name="keystore-actions"></a>

密钥存储操作决定了您的用户可以执行哪些操作，以及他们的 AWS KMS 分层密钥环如何使用您的密钥存储中允许列出的 KMS 密钥。 AWS 数据库加密 SDK 支持以下密钥存储操作配置。

**静态**  
当您静态配置密钥存储时，密钥存储只能使用与您在配置密钥存储操作时提供的 KMS 密钥 ARN 关联的 KMS 密钥。`kmsConfiguration`如果在创建、版本控制或获取分支密钥时遇到不同的 KMS 密钥 ARN，则会引发异常。  
您可以在中指定多区域 KMS 密钥`kmsConfiguration`，但该密钥的整个 ARN（包括区域）都保留在从 KMS 密钥派生的分支密钥中。您不能在其他区域指定密钥，必须提供完全相同的多区域密钥才能使值匹配。  
静态配置密钥存储操作时，可以执行使用操作 (`GetActiveBranchKey`、`GetBranchKeyVersion`、`GetBeaconKey`) 和管理操作 (`CreateKey`和`VersionKey`)。 `CreateKey`是一项特权操作，可以将新的 KMS 密钥 ARN 添加到您的密钥库许可名单。此 KMS 密钥可以创建新的活动分支密钥。我们建议限制对此操作的访问权限，因为将 KMS 密钥添加到密钥存储库后，便无法将其删除。

**Discovery**  
当您配置密钥库操作以进行发现时，密钥库可以使用密钥库中列入许可名单的任何 AWS KMS key ARN。但是，如果遇到多区域 KMS 密钥，并且该密钥的 ARN 中的区域与正在使用的客户端的区域不匹配，则会引发异常。 AWS KMS   
配置密钥库以供发现时，您无法执行管理操作，例如`CreateKey`和`VersionKey`。您只能执行启用加密、解密、签名和验证操作的使用操作。有关更多信息，请参阅 [实施最低权限](keystore-least-privilege.md)。

## 配置您的关键商店操作
<a name="config-keystore-actions"></a>

在配置密钥存储操作之前，请确保满足以下先决条件。
+ 确定您需要执行哪些操作。有关更多信息，请参阅 [实施最低权限](keystore-least-privilege.md)。
+ 选择逻辑密钥存储名称

  DynamoDB 表名称和逻辑密钥存储名称之间必须存在 one-to-one映射。逻辑密钥存储名称以加密方式绑定到表中存储的所有数据，以简化 DynamoDB 还原操作，在第一个用户最初定义后无法对其进行更改。在密钥存储操作中，必须始终指定相同的逻辑密钥存储名称。有关更多信息，请参阅 [logical key store name](create-keystore.md#logical-key-store-name)。

### 静态配置
<a name="static-keystore"></a>

以下示例静态配置密钥存储操作。您必须指定用作密钥存储的 DynamoDB 表的名称、密钥存储的逻辑名称以及标识对称加密 KMS 密钥的 KMS 密钥 ARN。

**注意**  
请仔细考虑您在静态配置密钥存储服务时指定的 KMS 密钥 ARN。该`CreateKey`操作将 KMS 密钥 ARN 添加到您的分支密钥存储许可名单中。将 KMS 密钥添加到分支密钥存储库后，便无法将其删除。

------
#### [ Java ]

```
final KeyStore keystore = KeyStore.builder().KeyStoreConfig(
	                 KeyStoreConfig.builder()
	                         .ddbClient(DynamoDbClient.create())
	                         .ddbTableName(keyStoreName)
	                         .logicalKeyStoreName(logicalKeyStoreName)
	                         .kmsClient(KmsClient.create())
	                         .kmsConfiguration(KMSConfiguration.builder()
	                                 .kmsKeyArn(kmsKeyArn)
	                                 .build())
	                         .build()).build();
```

------
#### [ C\$1 / .NET ]

```
var kmsConfig = new KMSConfiguration { KmsKeyArn = kmsKeyArn };
	 var keystoreConfig = new KeyStoreConfig
	 {
	     KmsClient = new AmazonKeyManagementServiceClient(),
	     KmsConfiguration = kmsConfig,
	     DdbTableName = keyStoreName,
	     DdbClient = new AmazonDynamoDBClient(),
	     LogicalKeyStoreName = logicalKeyStoreName
	 };
	 var keystore = new KeyStore(keystoreConfig);
```

------
#### [ Rust ]

```
let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;
let key_store_config = KeyStoreConfig::builder()
    .kms_client(aws_sdk_kms::Client::new(&sdk_config))
    .ddb_client(aws_sdk_dynamodb::Client::new(&sdk_config))
    .ddb_table_name(key_store_name)
    .logical_key_store_name(logical_key_store_name)
    .kms_configuration(KmsConfiguration::KmsKeyArn(kms_key_arn.to_string()))
    .build()?;

let keystore = keystore_client::Client::from_conf(key_store_config)?;
```

------

### 发现配置
<a name="discovery-keystore"></a>

以下示例配置了用于发现的密钥存储操作。您必须指定用作密钥存储的 DynamoDB 表的名称和逻辑密钥存储名称。

------
#### [ Java ]

```
final KeyStore keystore = KeyStore.builder().KeyStoreConfig(
                 KeyStoreConfig.builder()
                         .ddbClient(DynamoDbClient.create())
                         .ddbTableName(keyStoreName)
                         .logicalKeyStoreName(logicalKeyStoreName)
                         .kmsClient(KmsClient.create())
                         .kmsConfiguration(KMSConfiguration.builder()
                                 .discovery(Discovery.builder().build())
                                 .build())
                         .build()).build();
```

------
#### [ C\$1 / .NET ]

```
var keystoreConfig = new KeyStoreConfig
 {
     KmsClient = new AmazonKeyManagementServiceClient(),
     KmsConfiguration = new KMSConfiguration {Discovery = new Discovery()},
     DdbTableName = keyStoreName,
     DdbClient = new AmazonDynamoDBClient(),
     LogicalKeyStoreName = logicalKeyStoreName
 };
 var keystore = new KeyStore(keystoreConfig);
```

------
#### [ Rust ]

```
let key_store_config = KeyStoreConfig::builder()
        .kms_client(kms_client)
        .ddb_client(ddb_client)
        .ddb_table_name(key_store_name)
        .logical_key_store_name(logical_key_store_name)
        .kms_configuration(KmsConfiguration::Discovery(Discovery::builder().build()?))
        .build()?;
```

------