27.8. 使用


27.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");

可使用对密钥的引用通过 Spring XML 扩展 来实现相同的操作。

27.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

以下路由首先使用绑定到 Camel 注册表的 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}");

以下代码演示了如何加载使用上述 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;
    }
}

在 Spring a 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");

===changing the bufferSize

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

27.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);
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部