27.8. 使用
27.8.1. Raw keys リンクのコピーリンクがクリップボードにコピーされました!
エクスチェンジの署名および検証方法として最も基本的なのは、次のように KeyPair を使用する方法です。
KeyPair keyPair = KeyGenerator.getInstance("RSA").generateKeyPair();
from("direct:sign")
.setHeader(DigitalSignatureConstants.SIGNATURE_PRIVATE_KEY, constant(keys.getPrivate()))
.to("crypto:sign:message")
.to("direct:verify");
from("direct:verify")
.setHeader(DigitalSignatureConstants.SIGNATURE_PUBLIC_KEY_OR_CERT, constant(keys.getPublic()))
.to("crypto:verify:check");
Spring XML Extensions で鍵への参照を使用しても、同じ結果になります。
27.8.2. キーストアとエイリアス。 リンクのコピーリンクがクリップボードにコピーされました!
JCE は、秘密鍵と証明書のペアを格納し、それらを暗号化し、パスワードで保護するための非常に用途の広いキーストアの概念を提供します。これらは、取得 API にエイリアスを適用することで取得できます。鍵と証明書を鍵ストアに入れる方法はいくつかありますが、ほとんどの場合、これは外部の 'keytool' アプリケーションで行われます。
次のコマンドは、エイリアスが bob の鍵と証明書が格納された keystore を作成します。これは以下の例で使用できます。キーストアと鍵のパスワードは letmein です。
keytool -genkey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass letmein -alias bob -dname "CN=Bob,OU=IT,O=Camel" -noprompt
次のルートは、最初に Camel レジストリーにバインドされた KeyStore からエクスチェンジに Bob のエイリアスを使用して署名し、次に同じエイリアスを使用して検証します。
from("direct:sign")
.to("crypto:sign:keystoreSign?alias=bob&keystoreName=myKeystore&password=letmein")
.log("Signature: ${header.CamelDigitalSignature}")
.to("crypto:verify:keystoreVerify?alias=bob&keystoreName=myKeystore&password=letmein")
.log("Verified: ${body}");
次のコードは、上記の keytool コマンドを使用して作成されたキーストアをロードし、上記のルートで使用するために myKeystore という名前でレジストリーにバインドしてロードする方法を示しています。この例では、Camel 3 で導入された @Configuration および @BindToRegistry のアノテーションを使用して KeyStore をインスタンス化し、myKeyStore という名前で登録します。
@Configuration
public class KeystoreConfig {
@BindToRegistry
public KeyStore myKeystore() throws Exception {
KeyStore store = KeyStore.getInstance("JKS");
try (FileInputStream fis = new FileInputStream("keystore.jks")) {
store.load(fis, "letmein".toCharArray());
}
return store;
}
}
再び Spring では、ref を使用して実際のキーストアインスタンスを検索します。
27.8.3. JCE プロバイダーとアルゴリズムの変更 リンクのコピーリンクがクリップボードにコピーされました!
署名アルゴリズムまたはセキュリティープロバイダーの変更は、それらの名前を指定するだけの簡単な作業です。選択したアルゴリズムと互換性のあるキーも使用する必要があります。
27.8.4. 署名メッセージヘッダーの変更 リンクのコピーリンクがクリップボードにコピーされました!
署名を格納するために使用されるメッセージヘッダーを変更することが望ましい場合があります。次のように、ルート定義で別のヘッダー名を指定できます。
from("direct:sign")
.to("crypto:sign:keystoreSign?alias=bob&keystoreName=myKeystore&password=letmein&signatureHeaderName=mySignature")
.log("Signature: ${header.mySignature}")
.to("crypto:verify:keystoreVerify?alias=bob&keystoreName=myKeystore&password=letmein&signatureHeaderName=mySignature");
===bufferSize の変更
バッファーのサイズを更新する必要がある場合。
27.8.5. キーを動的に提供します。 リンクのコピーリンクがクリップボードにコピーされました!
受信者リストまたは同様の EIP を使用する場合、エクスチェンジの受信者は動的に変化する可能性があります。すべての受信者に同じキーを使用することは、実現可能でも望ましくもない場合があります。署名キーを交換ごとに動的に指定できると便利です。エクスチェンジは、署名する前に、ターゲット受信者のキーで動的に強化できます。これを容易にするために、署名メカニズムでは、以下のメッセージヘッダーを介して鍵を動的に提供できます。
-
DigitalSignatureConstants.SIGNATURE_PRIVATE_KEY,"CamelSignaturePrivateKey" -
DigitalSignatureConstants.SIGNATURE_PUBLIC_KEY_OR_CERT,"CamelSignaturePublicKeyOrCert"
キーストアエイリアスを動的に指定することを推奨します。この場合も、エイリアスはメッセージヘッダーで指定できます。
-
DigitalSignatureConstants.KEYSTORE_ALIAS,"CamelSignatureKeyStoreAlias"
ヘッダーは次のように設定されます。
Exchange unsigned = getMandatoryEndpoint("direct:alias-sign").createExchange();
unsigned.getIn().setBody(payload);
unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob");
unsigned.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_PASSWORD, "letmein".toCharArray());
template.send("direct:alias-sign", unsigned);
Exchange signed = getMandatoryEndpoint("direct:alias-sign").createExchange();
signed.getIn().copyFrom(unsigned.getMessage());
signed.getIn().setHeader(DigitalSignatureConstants.KEYSTORE_ALIAS, "bob");
template.send("direct:alias-verify", signed);