0

我有一个我创建的 Spring Boot 应用程序实例化了 ActiveMqSslBroker 的一个实例。我正在尝试使用 HermesJMS 作为客户端连接到该代理。

我在 Hermes 中配置了连接工厂如下:

  • 类:org.apache.activemq.ActiveMQSslConnectionFactory
  • 经纪人网址:ssl://localhost:61616
  • 密钥库:/path/to/client-keystore-containing-client-cert.ks
  • keyStoreKeyPassword: *****
  • 密钥存储类型:PKCS12
  • 信任存储:/path/to/trust-store-containing-broker-cert.ts
  • 信任商店密码:****
  • 信任存储类型:PKCS12

代理在我的 spring-boot 应用程序中配置如下:

  • SSL 连接器:
    • 经纪人网址:ssl://localhost:61616
    • 密钥管理器:
      • 从 KeyManagerFactory.getKeyManagers() 返回
        • 密钥库:/path/to/key-store-containing-broker-cert.ks
    • 信任管理器:
      • 从 TrustManagerFactory.getTrustManagers() 返回
        • TrustStore:/path/to/trust-store-containing-client-cert.ks

代理拒绝来自 Hermes 的连接请求,并出现以下错误:

javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown

所以显然 HermesJMS 没有发送包含在其配置的 keyStore 中的客户端证书。钥匙是否必须有一个特定的别名才能被 Hermes 拾取和使用?我可以设置一个属性来指定要使用的 keyStore 的别名吗?

4

1 回答 1

0

原来是用户错误。我配置了几个不同的会话,在我的 IDE 和 Hermes 之间来回切换时,我不知何故最终测试了一个使用错误连接工厂的会话。

切换到正确的会话后,事情开始起作用了。

为了完整起见,这是我如何使事情正常进行的:

在我的 Spring-Boot 应用程序中,我按如下方式定义了我的 BrokerService bean:

@Bean
public BrokerService broker(
    @Value("${spring.activemq.broker-url}") String brokerUrl,
    @Qualifier("brokerTrustManagerFactory") TrustManagerFactory trustManagerFactory,
    @Qualifier("brokerKeyManagerFactory") KeyManagerFactory keyManagerFactory,
    @Qualifier("secureRandom") SecureRandom secureRandom
){
    SslBrokerService brokerService = new SslBrokerService();
    brokerService.addSslConnector(
        brokerUrl,
        keyManagerFactory.getKeyManagers(),
        trustManagerFactory.getTrustManagers(),
        secureRandom
    );
    return brokerService;
}

以下是如何在客户端应用程序中配置连接工厂:

@Bean
ConnectionFactory connectionFactory(
    @Value("${spring.activemq.broker-url}") String brokerUrl,
    @Value("${spring.activemq.trustStorePath}") String trustStorePath,
    @Value("${spring.activemq.trustStorePass}") String trustStorePass,
    @Value("${spring.activemq.keyStorePath}") String keyStorePath,
    @Value("${spring.activemq.keyStorePass}") String keyStorePass,
    @Value("${client.key.pass}") String clientKeyPass
) {
    ActiveMQSslConnectionFactory connectionFactory = 
        new ActiveMQSslConnectionFactory(brokerUrl);
    connectionFactory.setTrustStore(trustStorePath);
    connectionFactory.setTrustStorePassword(trustStorePass);
    connectionFactory.setTrustStoreType("PKCS12");
    connectionFactory.setKeyStore(keyStorePath);
    connectionFactory.setKeyStorePassword(keyStorePass);
    connectionFactory.setKeyStoreKeyPassword(clientKeyPass);
    connectionFactory.setKeyStoreType("PKCS12");
    return connectionFactory;
}

希望有人会发现这个答案很有用。请注意,“spring.activemq.*”属性名称不是 Spring-Boot 识别的官方属性名称。它们只是网络上许多 spring-boot activemq 教程似乎使用的名称。

谢谢,戴夫

于 2020-07-13T16:25:45.840 回答