24.8. 使用


24.8.1. 原始密钥

签署和验证交换的最基本方法是使用 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");
Copy to Clipboard Toggle word wrap

可以通过 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
Copy to Clipboard Toggle word wrap

以下路由首先使用与 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}");
Copy to Clipboard Toggle word wrap

以下代码演示了如何加载使用上述 keytool 命令创建的密钥存储,并将它绑定到 registry 中用于上述路由中使用的名称 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;
    }
}
Copy to Clipboard Toggle word wrap

在 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");
Copy to Clipboard Toggle word wrap

===changing the bufferSize

如果需要更新缓冲区的大小。

24.8.5. 动态提供密钥。

当使用 Recipient 列表或类似的 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);
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat