簡體   English   中英

通過 SSL 連接時如何配置 HermesJMS 以使用特定的客戶端證書?

[英]How to configure HermesJMS to use a specific client certificate when connecting via SSL?

我創建了一個 Spring 引導應用程序,它實例化了 ActiveMqSslBroker 的一個實例。 我正在嘗試使用 HermesJMS 作為客戶端連接到該代理。

我在 Hermes 中配置了連接工廠如下:

  • Class: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 的別名嗎?

原來是用戶錯誤。 我配置了幾個不同的 session,在我的 IDE 和 Hermes 之間來回切換時,我不知何故最終在 Z21D6F40CFB511982E4424E0E250A9557 的連接上進行了測試。

切換到右側 session 后,事情開始起作用了。

為了完整起見,這是我如何使事情正常進行的:

在我的 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 認可的官方屬性名稱。 它們只是 web 上的許多 spring-boot activemq 教程似乎使用的名稱。

謝謝,戴夫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM