

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS CloudHSM JCE for Client SDK 5 の詳細設定
<a name="java-lib-configs"></a>

 AWS CloudHSM JCE プロバイダーには、ほとんどのお客様が使用する一般的な設定の一部ではない、以下の高度な設定が含まれています。
+ [複数のクラスターへの接続](java-lib-configs-multi.md)
+ [JCE を使用したキー抽出](java-lib-configs-getencoded.md)
+ [JCE の設定を再試行](java-lib-configs-retry.md)

# JCE プロバイダーを使用した複数の AWS CloudHSM クラスターへの接続
<a name="java-lib-configs-multi"></a>

この構成では、1 つのクライアントインスタンスが複数の AWS CloudHSM クラスターと通信できます。1 つのインスタンスが 1 つのクラスターとしか通信しない場合と比較して、これは一部のユースケースではコスト削減機能となる可能性があります。`CloudHsmProvider` クラスは、Java セキュリティのプロバイダークラスの AWS CloudHSM実装です。 [https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html](https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html)このクラスの各インスタンスは、 AWS CloudHSM クラスター全体への接続を表します。このクラスをインスタンス化して Java セキュリティプロバイダのリストに追加すると、標準 JCE クラスを使用して操作できるようになります。

次の例では、このクラスをインスタンス化して Java セキュリティプロバイダのリストに追加します。

```
if (Security.getProvider(CloudHsmProvider.PROVIDER_NAME) == null) {
    Security.addProvider(new CloudHsmProvider());
}
```

`CloudHsmProvider` は 2 つの方法で設定できます。

1. ファイルによる設定 (デフォルト設定)

1. コードを使用して設定

以下のトピックでは、これらの設定と、複数のクラスターに接続する方法について説明します。

**Topics**
+ [ファイルによる AWS CloudHSM `CloudHsmProvider` クラスの設定 (デフォルト設定)](java-lib-configs-default.md)
+ [コードを使用して AWS CloudHSM `CloudHsmProvider` クラスを設定する](java-lib-configs-using-code.md)
+ [複数の AWS CloudHSM クラスターに接続する](java-lib-connecting-to-multiclusters.md)

# ファイルによる AWS CloudHSM `CloudHsmProvider` クラスの設定 (デフォルト設定)
<a name="java-lib-configs-default"></a>

クラスを設定するデフォルトの方法は、 AWS CloudHSM `CloudHsmProvider` ファイルを使用することです。

デフォルトのコンストラクタを使用して `CloudHsmProvider` をインスタンス化すると、デフォルトでは、Linux の `/opt/cloudhsm/etc/cloudhsm-jce.cfg` パスで構成ファイルが検索されます。この設定ファイルは、`configure-jce` を使用して設定できます。

デフォルトコンストラクターを使用して作成されたオブジェクトは、デフォルトの CloudHSM プロバイダー名 `CloudHSM` を使用します。プロバイダー名は JCE とやり取りして、さまざまなオペレーションにどのプロバイダーを使用するかを判断するのに役立ちます。Cipher オペレーションに CloudHSM プロバイダー名を使用する例は次のとおりです。

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "CloudHSM");
```

# コードを使用して AWS CloudHSM `CloudHsmProvider` クラスを設定する
<a name="java-lib-configs-using-code"></a>

クライアント SDK バージョン 5.8.0 以降では、Java コードを使用して クラスを設定 AWS CloudHSM `CloudHsmProvider`することもできます。そのための方法は、`CloudHsmProviderConfig` クラスのオブジェクトを使用することです。`CloudHsmProviderConfigBuilder` を使用してこのオブジェクトを構築することができます。

`CloudHsmProvider` には、次の例のように、`CloudHsmProviderConfig` オブジェクトを取得する別のコンストラクターがあります。

**Example**  

```
CloudHsmProviderConfig config = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath)
                                            .withClusterUniqueIdentifier("CloudHsmCluster1")
        .withServer(CloudHsmServer.builder().withHostIP(hostName).build())  
                        .build())  
        .build();
CloudHsmProvider provider = new CloudHsmProvider(config);
```

この例では、JCE プロバイダーの名前は `CloudHsmCluster1` です。これは、アプリケーションが JCE とやり取りするために使用できる名前です。

**Example**  

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "CloudHsmCluster1");
```

あるいは、アプリケーションは上記で作成したプロバイダーオブジェクトを使用して、そのプロバイダーをオペレーションに使用することを JCE に知らせることもできます。

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider);
```

`withClusterUniqueIdentifier` メソッドで一意の識別子が指定されていない場合は、ランダムに生成されたプロバイダー名が自動的に作成されます。このランダムに生成された識別子を取得するには、アプリケーションは `provider.getName()` を呼び出して識別子を取得できます。

# 複数の AWS CloudHSM クラスターに接続する
<a name="java-lib-connecting-to-multiclusters"></a>

各 AWS CloudHSM は、クラスターへの接続`CloudHsmProvider`を表します。同じアプリケーションから別のクラスターと通信したい場合は、別のクラスターの設定を使用して `CloudHsmProvider` のオブジェクトをもう1つ作成し、次の例に示すように、プロバイダーオブジェクトまたはプロバイダー名を使用してこの他のクラスターとやり取りできます。

**Example**  

```
CloudHsmProviderConfig config = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath)
                                            .withClusterUniqueIdentifier("CloudHsmCluster1")
        .withServer(CloudHsmServer.builder().withHostIP(hostName).build())  
                        .build())  
        .build();
CloudHsmProvider provider1 = new CloudHsmProvider(config);

if (Security.getProvider(provider1.getName()) == null) {
    Security.addProvider(provider1);
}

CloudHsmProviderConfig config2 = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath2)
                                            .withClusterUniqueIdentifier("CloudHsmCluster2")
        .withServer(CloudHsmServer.builder().withHostIP(hostName2).build())  
                        .build())  
        .build();
CloudHsmProvider provider2 = new CloudHsmProvider(config2);

if (Security.getProvider(provider2.getName()) == null) {
    Security.addProvider(provider2);
}
```

上記の両方のプロバイダー (両方のクラスター) を設定したら、プロバイダーオブジェクトまたはプロバイダー名を使用してプロバイダーを操作できます。

`cluster1` と通信する方法を示すこの例を拡張すると、AES/GCM/NoPadding オペレーションに次のサンプルを使用できます。

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider1);
```

同じアプリケーションで、プロバイダー名を使用して 2 番目のクラスターで「AES」キー生成を行う場合は、次のサンプルを使用することもできます。

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider2.getName());
```

# の JCE を使用したキー抽出 AWS CloudHSM
<a name="java-lib-configs-getencoded"></a>

Java Cryptography Extension (JCE) は、さまざまな暗号化実装をプラグインできるアーキテクチャを使用します。 は、暗号化オペレーションを HSM にオフロードする 1 つの JCE プロバイダーを AWS CloudHSM 出荷します。他のほとんどの JCE プロバイダーが AWS CloudHSM に保存されているキーを操作するには、HSM のキーバイトをクリアテキストでマシンのメモリに抽出して使用する必要があります。HSM では通常、キーを ラップされたオブジェクト としてのみ抽出でき、クリアテキストとして抽出することはできません。ただし、プロバイダー間の統合のユースケースをサポートするために、 では、クリアでキーバイトの抽出を有効にするオプトイン設定オプション AWS CloudHSM を許可します。

**重要**  
JCE は、AWS CloudHSM プロバイダーが指定されるか、 AWS CloudHSM キーオブジェクトが使用される AWS CloudHSM たびに、オペレーションを にオフロードします。HSM 内でオペレーションが行われることが予想される場合は、キーを明確に抽出する必要はありません。クリアテキストでのキー抽出が必要なのは、サードパーティのライブラリや JCE プロバイダーの制限により、アプリケーションがキーのラップやラップ解除などの安全なメカニズムを使用できない場合のみです。

 AWS CloudHSM JCE プロバイダーは、デフォルトで外部 JCE プロバイダーと連携する**パブリックキー**の抽出を許可します。以下の方法は常に許可されています。


| Class | 方法 | Format (getEncoded) | 
| --- | --- | --- | 
| EcPublicKey | getEncoded () | X.509 | 
|  | getW() | 該当なし | 
| RSAPublicKey | getEncoded () | X.509 | 
|  | getPublicExponent() | 該当なし | 
| CloudHsmRsaPrivateCrtKey | getPublicExponent() | 該当なし | 

 AWS CloudHSM JCE プロバイダーは、デフォルトで**プライベート**キーまたは**シー**クレットキーに対してクリアなキーバイトの抽出を許可しません。ユースケースで必要な場合は、以下の条件で **プライベート** または **シークレット** キーのキーバイトを消去して抽出できます。

1. プライベートまたはシークレットキーの `EXTRACTABLE` 属性は「**true**」に設定されています。
   + デフォルトでは、プライベートキーとシークレットキーの `EXTRACTABLE` 属性は「**true**」に設定されています。`EXTRACTABLE` キーは HSM からのエクスポートが許可されているキーです。詳細については、「[クライアント SDK 5 向け](java-lib-attributes_5.md)サポートされている Java 属性」を参照してください。

1. プライベートキーとシークレットキーの `WRAP_WITH_TRUSTED` 属性は「**false**」に設定されます。
   + `getEncoded`、`getPrivateExponent`、`getS`およびクリアでエクスポートできないプライベートキーでは使用できません。`WRAP_WITH_TRUSTED` は、プライベートキーを HSM からクリアにエクスポートすることはできません。詳細については、「[信頼できるキーを使ったキーのアンラップの制御](manage-keys-using-trusted-keys.md)」を参照してください。

# JCE プロバイダーがプライベートキーシークレットを から抽出することを許可する AWS CloudHSM
<a name="get-encoded-take-out-private-keys"></a>

次の手順を使用して、 AWS CloudHSM JCE プロバイダーがプライベートキーシークレットを抽出できるようにします。

**重要**  
この設定変更により、HSM クラスターからすべてのクリアの `EXTRACTABLE` キーバイトを抽出できるようになります。セキュリティを高めるには、[キーラッピング方法](java-lib-supported_5.md)を使用して HSM から安全にキーを抽出することを検討してください。これにより、HSM からキーバイトが意図せず抽出されるのを防ぐことができます。

1. 以下のコマンドを使用して、**プライベート** キーと **シークレット** キーを JCE で抽出できるようにします。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/configure-jce --enable-clear-key-extraction-in-software
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --enable-clear-key-extraction-in-software
   ```

------

1. クリアキー抽出を有効にすると、以下の方法でプライベートキーをメモリーに抽出できるようになります。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/cloudhsm/latest/userguide/get-encoded-take-out-private-keys.html)

JCE がキーをクリアでエクスポートできないようにして、デフォルトの動作に戻したい場合は、以下のコマンドを実行します。

------
#### [ Linux ]

```
$ /opt/cloudhsm/bin/configure-jce --disable-clear-key-extraction-in-software
```

------
#### [ Windows ]

```
PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --disable-clear-key-extraction-in-software
```

------

# の JCE の再試行コマンド AWS CloudHSM
<a name="java-lib-configs-retry"></a>

AWS CloudHSM クライアント SDK 5.8.0 以降には、HSM スロットリングされたオペレーションをクライアント側から再試行する自動再試行戦略が組み込まれています。HSM が以前のオペレーションが多すぎてそれ以上リクエストを受け付けられないためにオペレーションをスロットリングすると、Client SDK はスロットリングされたオペレーションを最大 3 回再試行しますが、その間、エクスポネンシャルバックオフします。この自動再試行戦略は、**オフ**と**スタンダード**の 2 つのモードのいずれかに設定できます。
+ **オフ**: クライアント SDK は、HSM によってスロットリングされたオペレーションに対しては再試行戦略を一切実行しません。
+ **スタンダード**: これはクライアント SDK 5.8.0 以降のデフォルトモードです。このモードでは、クライアント SDK はエクスポネンシャルバックオフすることで、スロットリングされた操作を自動的に再試行します。

詳細については、「[HSM スロットリング](troubleshoot-hsm-throttling.md)」を参照してください。

## 再試行コマンドをオフモードに設定する
<a name="w2aac25c21c25c25c15b9"></a>

------
#### [ Linux ]

**Linux でクライアント SDK 5 向けに再試行コマンドを **off** に設定するには**
+ 次のコマンドを使用して再試行設定を **off** モードに設定できます。

  ```
  $ sudo /opt/cloudhsm/bin/configure-jce --default-retry-mode off
  ```

------
#### [ Windows ]

**Windows 上の クライアント SDK 5 向けに再試行コマンドを **off** に設定するには**
+ 次のコマンドを使用して再試行設定を **off** モードに設定できます。

  ```
  PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --default-retry-mode off
  ```

------