AWS CloudHSM クライアント SDK 3 でサポートされる Java キー属性 - AWS CloudHSM

AWS CloudHSM クライアント SDK 3 でサポートされる Java キー属性

このトピックでは、Java ライブラリバージョン 3.1 の独自の拡張機能を使用して、AWS CloudHSM クライアント SDK 3 のキー属性を設定する方法について説明します。この拡張機能を使用して、これらのオペレーション中にサポートされるキー属性とその値を設定します。

  • キー生成

  • キーのインポート

  • キーのラップ解除

注記

カスタムキー属性を設定するための拡張機能は、オプション機能です。Java ライブラリバージョン 3.0 で機能するコードがすでにある場合、そのコードを変更する必要はありません。作成したキーには、以前と同じ属性が引き続き含まれます。

属性について

キー属性を使用して、パブリックキー、プライベートキー、シークレットキーなど、キーオブジェクトで許可されるアクションを指定します。キー属性と値は、キーオブジェクトの作成オペレーション中に定義します。

ただし、Java Cryptography Extension (JCE) では、キー属性に値を設定する方法が指定されていないため、ほとんどのアクションがデフォルトで許可されていました。これに対して、PKCS # 11 標準では、より制限の厳しいデフォルトのある包括的な属性のセットが定義されています。Java ライブラリバージョン 3.1 以降、CloudHSM は、一般的に使用される属性に対してより制限の厳しい値を設定できる独自の拡張機能を提供します。

サポートされている属性

次の表に示す属性の値を設定できます。ベストプラクティスとして、制限する属性の値のみを設定してください。値を指定しない場合、CloudHSM は次の表で指定されたデフォルト値を使用します。デフォルト値の列のセルが空の場合は、属性に割り当てられている特定のデフォルト値がないことを示します。

属性 デフォルト値 メモ
対称キー キーペアのパブリックキー キーペアのプライベートキー
CKA_TOKEN FALSE FALSE FALSE

クラスター内のすべての HSM にレプリケートされ、バックアップに含まれる永続的なキー。CKA_TOKEN = FALSE は、セッションキーを意味します。セッションキーは 1 つの HSM にのみロードされ、HSM への接続が切断されると自動的に消去されます。

CKA_LABEL ユーザー定義の文字列。これにより、HSM のキーを簡単に識別できます。
CKA_EXTRACTABLE TRUE TRUE True は、このキーを HSM からエクスポートできることを示します。
CKA_ENCRYPT TRUE TRUE True は、キーを使用して任意のバッファを暗号化できることを示します。
CKA_DECRYPT TRUE TRUE True は、キーを使用して任意のバッファを復号できることを示します。通常は、CKA_WRAP が true に設定されているキーに対して、これを FALSE に設定します。
CKA_WRAP TRUE TRUE True は、キーを使用して別のキーをラップできることを示します。通常、プライベートキーの場合、これを FALSE に設定します。
CKA_UNWRAP TRUE TRUE True は、キーを使用して別のキーをラップ解除 (インポート) できることを示します。
CKA_SIGN TRUE TRUE True は、キーを使用してメッセージダイジェストに署名できることを示します。パブリックキーおよびアーカイブしたプライベートキーの場合、通常 FALSE に設定されます。
CKA_VERIFY TRUE TRUE True は、キーを使用して署名を検証できることを示します。これは通常、プライベートキーの場合、FALSE に設定されます。
CKA_PRIVATE TRUE TRUE TRUE True は、ユーザーが認証されるまで、ユーザーがキーにアクセスできないことを示します。わかりやすくするために、この属性が FALSE に設定されている場合でも、ユーザーが認証されるまで CloudHSM のどのキーにもアクセスできません。
注記

PKCS #11 ライブラリでは、より広範な属性がサポートされます。詳細については、「サポートされている PKCS #11 属性」を参照してください。

キーの属性設定

CloudHsmKeyAttributesMapJava Map のようなオブジェクトで、キーオブジェクトの属性値を設定するために使用できます。CloudHsmKeyAttributesMap 関数のメソッドは、Java マップ操作のメソッドと同様です。

属性にカスタム値を設定するには、次の 2 つのオプションがあります。

  • 次の表に示す方法を使用します。

  • このドキュメントの後半で説明するビルダーパターンの使用

属性マップオブジェクトは、属性を設定するための次のメソッドをサポートしています。

操作 戻り値 CloudHSMKeyAttributesMap 方法
既存のキーのキー属性の値を取得する オブジェクト (値を含む) または null

get(keyAttribute)

1 つのキー属性の値を入力します。 キー属性のマッピングがなかった場合、キー属性に関連付けられた以前の値、または null

put(keyAttribute, value)

複数のキー属性の値を設定する 該当なし

putAll(keyAttributesMap)

属性マップからキーと値のペアを削除する

キー属性のマッピングがなかった場合、キー属性に関連付けられた以前の値、または null

remove(keyAttribute)

注記

明示的に指定しない属性は、上記の サポートされている属性 の表に示したデフォルトに設定されます。

ビルダーパターンの例

通常、開発者にとっては、ビルダーパターンを介してクラスを利用する方がより便利です。例:

import com.amazonaws.cloudhsm.CloudHsmKeyAttributes; import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap; import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap; CloudHsmKeyAttributesMap keyAttributesSessionDecryptionKey = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "ExtractableSessionKeyEncryptDecrypt") .put(CloudHsmKeyAttributes.CKA_WRAP, false) .put(CloudHsmKeyAttributes.CKA_UNWRAP, false) .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_VERIFY, false) .build(); CloudHsmKeyAttributesMap keyAttributesTokenWrappingKey = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "TokenWrappingKey") .put(CloudHsmKeyAttributes.CKA_TOKEN, true) .put(CloudHsmKeyAttributes.CKA_ENCRYPT, false) .put(CloudHsmKeyAttributes.CKA_DECRYPT, false) .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_VERIFY, false) .build();

開発者は、キーテンプレートのベストプラクティスを実施するための便利な方法として、事前に定義された属性セットを利用することもできます。例:

//best practice template for wrapping keys CloudHsmKeyAttributesMap commonKeyAttrs = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, false) .put(CloudHsmKeyAttributes.CKA_DECRYPT, false) .build(); // initialize a new instance of CloudHsmKeyAttributesMap by copying commonKeyAttrs // but with an appropriate label CloudHsmKeyAttributesMap firstKeyAttrs = new CloudHsmKeyAttributesMap(commonKeyAttrs); firstKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, "key label"); // alternatively, putAll() will overwrite existing values to enforce conformance CloudHsmKeyAttributesMap secondKeyAttrs = new CloudHsmKeyAttributesMap(); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_DECRYPT, true); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_ENCRYPT, true); secondKeyAttrs.put(CloudHsmKeyAttributes.CKA_LABEL, “safe wrapping key”); secondKeyAttrs.putAll(commonKeyAttrs); // will overwrite CKA_DECRYPT to be FALSE

キーペアの属性設定

Java クラス CloudHsmKeyPairAttributesMap を使用して、キーペアのキー属性を処理します。CloudHsmKeyPairAttributesMap は、2 つの CloudHsmKeyAttributesMap オブジェクトをカプセル化します。1 つはパブリックキー用ともう 1 つはプライベートキー用です。

パブリックキーとプライベートキーの個々の属性を個別に設定するには、そのキーの対応する CloudHsmKeyAttributes マップオブジェクトで put() メソッドを使用できます。getPublic() メソッドを使用してパブリックキーの属性マップを取得し、getPrivate() を使用してプライベートキーの属性マップを取得します。引数としてキーペア属性マップを使用する putAll() を使用して、パブリックキーペアとプライベートキーペアの両方に、複数のキー属性の値を一緒に入力します。

ビルダーパターンの例

通常、開発者にとっては、ビルダーパターンを介してキー属性を設定する方がより便利です。例:

import com.amazonaws.cloudhsm.CloudHsmKeyAttributes; import com.amazonaws.cloudhsm.CloudHsmKeyAttributesMap; import com.amazonaws.cloudhsm.CloudHsmKeyPairAttributesMap; //specify attributes up-front CloudHsmKeyAttributesMap keyAttributes = new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_SIGN, false) .put(CloudHsmKeyAttributes.CKA_LABEL, "PublicCertSerial12345") .build(); CloudHsmKeyPairAttributesMap keyPairAttributes = new CloudHsmKeyPairAttributesMap.Builder() .withPublic(keyAttributes) .withPrivate( new CloudHsmKeyAttributesMap.Builder() //or specify them inline .put(CloudHsmKeyAttributes.CKA_LABEL, "PrivateCertSerial12345") .put (CloudHSMKeyAttributes.CKA_WRAP, FALSE) .build() ) .build();
注記

この独自の拡張機能の詳細については、GitHub の Javadoc アーカイブと sample を参照してください。Javadoc を調べるには、アーカイブをダウンロードして展開します。

まとめ

キーオペレーションでキー属性を指定するには、次の手順に従います。

  1. 対称キーの CloudHsmKeyAttributesMap、またはキーペアの CloudHsmKeyPairAttributesMap をインスタンス化します。

  2. 必要なキー属性と値を使用して、ステップ 1 からの属性オブジェクトを定義します。

  3. 特定のキータイプに対応する Cavium*ParameterSpec クラスをインスタンス化し、この設定された属性オブジェクトをコンストラクタに渡します。

  4. この Cavium*ParameterSpec オブジェクトを対応する暗号クラスまたはメソッドに渡します。

参考のために、次の表に、カスタムキー属性をサポートする Cavium*ParameterSpec クラスとメソッドを示します。

キータイプ パラメータ仕様クラス コンストラクタの例
基本クラス CaviumKeyGenAlgorithmParameterSpec CaviumKeyGenAlgorithmParameterSpec(CloudHsmKeyAttributesMap keyAttributesMap)
DES CaviumDESKeyGenParameterSpec CaviumDESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap)
RSA CaviumRSAKeyGenParameterSpec CaviumRSAKeyGenParameterSpec(int keysize, BigInteger publicExponent, CloudHsmKeyPairAttributesMap keyPairAttributesMap)
シークレット CaviumGenericSecretKeyGenParameterSpec CaviumGenericSecretKeyGenParameterSpec(int size, CloudHsmKeyAttributesMap keyAttributesMap)
AES CaviumAESKeyGenParameterSpec CaviumAESKeyGenParameterSpec(int keySize, byte[] iv, CloudHsmKeyAttributesMap keyAttributesMap)
EC CaviumECGenParameterSpec CaviumECGenParameterSpec(String stdName, CloudHsmKeyPairAttributesMap keyPairAttributesMap)

サンプルコード: キーの生成とラップ

次の簡単なコードサンプルは、キー生成とキーラップの 2 つの異なるオペレーションの手順を示しています。

// Set up the desired key attributes KeyGenerator keyGen = KeyGenerator.getInstance("AES", "Cavium"); CaviumAESKeyGenParameterSpec keyAttributes = new CaviumAESKeyGenParameterSpec( 256, new CloudHsmKeyAttributesMap.Builder() .put(CloudHsmKeyAttributes.CKA_LABEL, "MyPersistentAESKey") .put(CloudHsmKeyAttributes.CKA_EXTRACTABLE, true) .put(CloudHsmKeyAttributes.CKA_TOKEN, true) .build() ); // Assume we already have a handle to the myWrappingKey // Assume we already have the wrappedBytes to unwrap // Unwrap a key using Custom Key Attributes CaviumUnwrapParameterSpec unwrapSpec = new CaviumUnwrapParameterSpec(myInitializationVector, keyAttributes); Cipher unwrapCipher = Cipher.getInstance("AESWrap", "Cavium"); unwrapCipher.init(Cipher.UNWRAP_MODE, myWrappingKey, unwrapSpec); Key unwrappedKey = unwrapCipher.unwrap(wrappedBytes, "AES", Cipher.SECRET_KEY);