Как настроить HermesJMS для использования определенного сертификата c клиента при подключении через SSL? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть созданное мной приложение Spring Boot, которое создает экземпляр ActiveMqSslBroker. Я пытаюсь подключиться к этому брокеру, используя HermesJMS в качестве клиента.

Я настроил фабрику соединений в Hermes следующим образом:

  • Class: org. apache .activemq .ActiveMQSslConnectionFactory
  • brokerURL: ssl: // localhost: 61616
  • keyStore: /path/to/client-keystore-contain-client-cert.ks
  • keyStoreKeyPassword: * ****
  • keyStoreType: PKCS12
  • trustStore: /path/to/trust-store-contain-broker-cert.ts
  • trustStorePassword: ****
  • trustStoreType: PKCS12

Брокер настроен в моем приложении с весенней загрузкой следующим образом:

  • Коннектор SSL:
    • brokerUrl: ssl: // localhost: 61616
    • KeyManager:
      • , возвращенный из KeyManagerFactory.getKeyManagers ()
        • KeyStore: / path / to / key-store-contains-broker-cert .ks
    • TrustManager:
      • возвращается из TrustManagerFactory.getTrustManagers ()
        • TrustStore: /path/to/trust-store-contain-client-cert.ks

Брокер отклоняет запросы на соединение от Hermes со следующей ошибкой:

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

Таким образом, очевидно, HermesJMS не отправляет сертификат клиента, который содержится в его настроенном хранилище ключей. Должен ли ключ иметь специальный псевдоним c, чтобы Гермес мог его подобрать и использовать? Есть ли свойство, которое я могу установить, чтобы указать псевдоним из хранилища ключей для использования?

1 Ответ

0 голосов
/ 13 июля 2020

Оказывается, это ошибка пользователя. У меня было настроено несколько разных сеансов, и, переключаясь между моей IDE и Hermes, я каким-то образом закончил тестирование сеанса, в котором использовалась неправильная фабрика соединений.

После переключения на правильный сеанс все начало работать.

Для полноты картины я получил следующее:

В моем приложении Spring-Boot я определил свой bean-компонент BrokerService следующим образом:

@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 в Интернете.

Спасибо, Дэйв

...