

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

# 使用客户端 SDK 3 将 AWS CloudHSM 密钥库与 keytool 配合使用
<a name="using_keystore_with_keytool"></a>

[Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) 是一个常见的命令行实用程序，用于 Linux 系统上的常见密钥和证书任务。有关 keytool 的完整教程不在 AWS CloudHSM 文档的讨论范围内。本文介绍了在通过密钥库用作信任根时，应与各种 AWS CloudHSM 密钥工具函数一起使用的特定参数。 AWS CloudHSM 

在密钥库中 AWS CloudHSM 使用 keytool 时，请为任何 keytool 命令指定以下参数：

```
-storetype CLOUDHSM \
		-J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib
```

如果要使用 AWS CloudHSM 密钥库创建新的密钥库文件，请参阅[使用 AWS CloudHSM KeyStore 适用于 AWS CloudHSM 客户端 SDK 3](alternative-keystore.md#using_cloudhsm_keystore)。要使用现有密钥库，请使用 keytool 的 –keystore 参数指定密钥库的名称（包括路径）。如果您在 keytool 命令中指定了不存在的密钥存储文件，则 AWS CloudHSM 密钥库会创建一个新的密钥存储文件。

# 使用 keytool 创建新 AWS CloudHSM 密钥
<a name="create_key_keytool"></a>

你可以使用 keytool 生成 AWS CloudHSM JCE SDK 支持的任何类型的密钥。请参阅 Java 库中[支持的密钥](java-lib-supported.md#java-keys)文章中的密钥和长度的完整列表。

**重要**  
通过 keytool 生成的密钥在软件中生成，然后 AWS CloudHSM 作为可提取的永久密钥导入到。

直接在硬件安全模块 (HSM) 上创建不可提取的密钥，然后将其与 keytool 或 Jarsigner 一起使用的说明见向密钥库[注册](register-pre-existing-keys-with-keystore.md)已存在的密钥中的代码示例。 AWS CloudHSM 我们强烈建议在 keytool 之外生成不可导出的密钥，然后将相应的证书导入密钥库。如果您通过 keytool 和 jarsigner 使用可提取的 RSA 或 EC 密钥，则提供程序会从中导出密钥， AWS CloudHSM 然后在本地使用该密钥进行签名操作。

如果您有多个客户端实例连接到 CloudHSM 集群，请注意，在一个客户端实例的密钥库上导入证书不会自动使证书在其他客户端实例上可用。要在每个客户端实例上注册密钥和关联证书，您需要运行 Java 应用程序，如[使用 Keytool 生成 CSR](generate_csr_using_keytool.md) 中所述。或者，您可以在一个客户端上进行必要的更改，并将生成的密钥库文件复制到其他每个客户端实例。

**示例 1：**生成对称 AES-256 密钥，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<secret label>*替换为唯一的标签。

```
keytool -genseckey -alias <secret label> -keyalg aes \
		-keysize 256 -keystore example_keystore.store \
		-storetype CloudHSM -J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib/
```

**示例 2：**生成 RSA 2048 密钥对，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<RSA key pair label>*替换为唯一的标签。

```
keytool -genkeypair -alias <RSA key pair label> \
        -keyalg rsa -keysize 2048 \
        -sigalg sha512withrsa \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**示例 3：**生成 p256 ED 密钥，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<ec key pair label>*替换为唯一的标签。

```
keytool -genkeypair -alias <ec key pair label> \
        -keyalg ec -keysize 256 \
        -sigalg SHA512withECDSA \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

您可以在 Java 库中找到[支持的签名算法](java-lib-supported.md#java-sign-verify)列表。

# 使用 AWS CloudHSM keytool 删除密钥
<a name="delete_key_using_keytool"></a>

密 AWS CloudHSM 钥库不支持删除密钥。要删除密钥，必须使用 AWS CloudHSM的命令行工具的`deleteKey`功能[使用 KM AWS CloudHSM U 删除密钥](key_mgmt_util-deleteKey.md)。

# 使用 keyt AWS CloudHSM ool 生成 CSR
<a name="generate_csr_using_keytool"></a>

如果使用 [适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl-library.md)，您可以在生成证书签名请求 (CSR) 时获得最大的灵活性。以下命令使用 keytool 为具有别名 `example-key-pair` 的密钥对生成 CSR。

```
keytool -certreq -alias <key pair label> \
        -file example_csr.csr \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**注意**  
要从 keytool 使用密钥对，该密钥对必须在指定的密钥库文件中包含一个条目。如果要使用在 keytool 之外生成的密钥对，则必须将密钥和证书元数据导入密钥库中。有关导入密钥库数据的说明，请参阅[使用 Keytool 将中间证书和根证书导入 AWS CloudHSM 密钥库](import_cert_using_keytool.md)。

# 使用 keytool 将中间证书和根证书导入 AWS CloudHSM 密钥存储库
<a name="import_cert_using_keytool"></a>

要将 CA 证书导入 AWS CloudHSM，必须在新导入的证书上启用对完整证书链的验证。以下命令是一个示例。

```
keytool -import -trustcacerts -alias rootCAcert \
        -file rootCAcert.cert -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则在一个客户端实例的密钥库中导入证书不会自动使该证书在其他客户端实例上可用。您必须在每个客户端实例上导入证书。

# 使用 keytool 从 AWS CloudHSM 密钥库中删除证书
<a name="delete_cert_using_keytool"></a>

以下命令显示了如何从 Java keytool 密钥库中删除 AWS CloudHSM 证书的示例。

```
keytool -delete -alias mydomain -keystore \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则删除一个客户端实例密钥存储中的证书不会自动从其他客户端实例中删除该证书。您必须删除每个客户端实例上的证书。

# 使用 keytool 将有效的证书导入 AWS CloudHSM 密钥库
<a name="import_working_cert_using_keytool"></a>

签署证书签名请求 (CSR) 后，您可以将其导入 AWS CloudHSM 密钥库并将其与相应的密钥对关联。以下命令是一个示例。

```
keytool -importcert -noprompt -alias <key pair label> \
        -file example_certificate.crt \
        -keystore example_keystore.store
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

别名应该是密钥库中具有关联证书的密钥对。如果密钥是在 keytool 之外生成的，或者在其他客户端实例上生成的，则必须先将密钥和证书元数据导入密钥库中。有关导入证书元数据的说明，请参阅向密钥[库注册已存在的密钥](register-pre-existing-keys-with-keystore.md)中的代码示例。 AWS CloudHSM 

证书链必须是可验证的。如果无法验证证书，则可能需要将签名（证书颁发机构）证书导入密钥库，以便验证证书链。

# AWS CloudHSM 使用 keytool 导出证书
<a name="export_cert_using_keytool"></a>

以下示例生成二进制 X.509 格式的证书。要从中导出人类可读的证书 AWS CloudHSM，请在`-exportcert`命令中`-rfc`添加。

```
keytool -exportcert -alias <key pair label> \
        -file example_exported_certificate.crt \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```