24.8. 使用
24.8.1. 原始密钥 复制链接链接已复制到粘贴板!
签署和验证交换的最基本方法是使用 KeyPair,如下所示:
可以通过 Spring XML 扩展 (使用对密钥的引用)来实现相同的操作。
24.8.2. keystores 和 Aliases。 复制链接链接已复制到粘贴板!
JCE 提供了非常通用的密钥存储概念,用于对私钥和证书进行密钥对,使其加密且受密码保护。可以通过将别名应用到检索 API 来检索它们。可以通过多种方式将密钥和证书获取到密钥存储中,最常通过外部"keytool"应用程序完成。
以下命令将创建一个包含由 bob 别名的密钥和证书的密钥存储,如下例所示。密钥存储的密码和密钥是 letmein。
keytool -genkey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass letmein -alias bob -dname "CN=Bob,OU=IT,O=Camel" -noprompt
keytool -genkey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass letmein -alias bob -dname "CN=Bob,OU=IT,O=Camel" -noprompt
以下路由首先使用与 Camel Registry 绑定的 KeyStore 中的 KeyStore 的别名为交换签名,然后使用同一别名进行验证。
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}");
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 命令创建的密钥存储,并将它绑定到 registry 中用于上述路由中使用的名称 myKeystore。该示例使用 Camel 3 中引入的 @Configuration 和 @BindToRegistry 注解来实例化 KeyStore,并将它注册到名称 myKeyStore。
在 Spring a ref 中再次用于查找实际的密钥存储实例。
24.8.3. 更改 JCE Provider 和 Algorithm 复制链接链接已复制到粘贴板!
更改签名算法或安全供应商是指定名称的简单问题。您还需要使用与您选择的算法兼容的密钥。
24.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");
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");
===changing the bufferSize
如果需要更新缓冲区的大小。
24.8.5. 动态提供密钥。 复制链接链接已复制到粘贴板!
当使用 Recipient 列表或类似的 EIP 时,交换的接收者可能会动态变化。在所有接收者中使用相同的密钥可能并不可行。在每次交换时能够动态指定签名密钥会很有用。然后,在签名前,可以使用其目标接收者的密钥动态增强交换。为方便此目的,签名机制允许通过以下消息标头动态提供密钥。
-
DigitalSignatureConstants.SIGNATURE_PRIVATE_KEY,"CamelSignaturePrivateKey" -
DigitalSignatureConstants.SIGNATURE_PUBLIC_KEY_OR_CERT,"CamelSignaturePublicKeyOrCert"
最好是动态提供密钥存储别名。再次在消息标头中提供别名
-
DigitalSignatureConstants.KEYSTORE_ALIAS,"CamelSignatureKeyStoreAlias"
标头将设置为如下: