ActiveMQ javax. net .ssl.sslhandshakeexception пустая цепочка сертификатов - PullRequest
0 голосов
/ 19 июня 2020

Я использовал эту ссылку для создания самоподписанного root сертификата CA и пары ключей сервера

Использовал эту ссылку для создания пары ключей клиента с использованием ранее созданных root сертификат

Хотя ссылки предназначены для настройки SSL для MosquittoMQ, а мой вариант использования - для ActiveMQ, я считаю, что процедура создания сертификата остается одинаковой для обоих случаев.

Я использую Java клиентов. Хранилище ключей брокера содержит сертификат root и сервер publi c и закрытый ключ, объединенные в файл PKCS12, как того требует хранилище ключей, а хранилище доверенных сертификатов брокера содержит ключ publi c клиента. Клиентское хранилище ключей содержит клиентский publi c и закрытый ключ, объединенные в файл PKCS12, а клиентское хранилище доверенных сертификатов содержит сертификат root. Клиенты Java используют порт 61714 для подключения к брокеру. С приведенной выше конфигурацией хранилищ ключей и хранилищ доверенных сертификатов я получаю исключение null cert chain . Может ли кто-нибудь сказать мне, правильный ли это способ настройки хранилищ ключей и доверия? Следует ли связывать сертификат root и сертификат сервера вместо того, чтобы присутствовать отдельно в хранилище ключей брокера? Я новичок в этом и немного потерялся.

Конфигурация транспортного коннектора брокера ActiveMQ показана ниже

    <managementContext>
            <managementContext createConnector="false"/>
</managementContext>
<sslContext> 
            <sslContext keyStore="file:${activemq.base}/conf/broker.ks"
              keyStorePassword="changeit" trustStore="file:${activemq.base}/conf/broker.ts"
              trustStorePassword="changeit"/> 
</sslContext>
<transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxInactivityDuration=300000&amp;wireFormat.maxFrameSize=104857600&amp;jms.messagePrioritySupported=false"/>
        <transportConnector name="ssl" uri="ssl://0.0.0.0:61714?trace=true&amp;needClientAuth=true&amp;transport.enabledProtocols=TLSv1.2"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt+ssl" uri="mqtt+ssl://0.0.0.0:8883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

файл application.properties на клиенте Java

# Embedded ActiveMQ Configuration
spring.activemq.in-memory=false
spring.activemq.pool.enabled=false
activemq.broker-url=tcp://localhost:61616
activemq.ssl-url=ssl://localhost:61714


# Spring JMS Settings
#spring.jms.pub-sub-domain=true

# Truststore used by client.
JMS_BROKER_TRUSTSTORE=E:\\apacheActiveMQ\\apache-activemq-5.13.0\\conf\\client.ts
JMS_BROKER_TRUSTSTORE_TYPE=JKS
JMS_BROKER_TRUSTSTORE_PASSWORD=changeit
# Keystore used by client.
JMS_BROKER_KEYSTORE=E:\\apacheActiveMQ\\apache-activemq- 5.13.0\\conf\\client.ks
JMS_BROKER_KEYSTORE_TYPE=JKS
JMS_BROKER_KEYSTORE_PASSWORD=changeit

Файл, который занимается настройкой фабрики соединений ActiveMQ на клиенте Java

@Bean
public ActiveMQSslConnectionFactory activeMQSslConnectionFactory() {
    ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory(sslUrl);
    try {
        connectionFactory.setTrustStore(pathToTrustStore);
        connectionFactory.setTrustStorePassword(truststorePassword);
        connectionFactory.setKeyStore(pathToKeystore);
        connectionFactory.setKeyStorePassword(keystorePassword);
    } catch (Exception e) {
        System.out.println("Error");
    }
    return connectionFactory;
}

/**
 * Initialise {@link JmsTemplate} as required
 */
@Bean
public JmsTemplate jmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory(activeMQSslConnectionFactory());
    jmsTemplate.setExplicitQosEnabled(true);

    //setting PuSubDomain to true configures JmsTemplate to work with topics instead of queues
    jmsTemplate.setPubSubDomain(true);
    jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    return jmsTemplate;
}

/**
 * Initialise {@link DefaultJmsListenerContainerFactory} as required
 */
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(activeMQSslConnectionFactory());
    //setting PuSubDomain to true configures the DefaultJmsListenerContainerFactory to work with topics instead of queues
    factory.setPubSubDomain(true);
    return factory;
}

1 Ответ

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

Отвечая на свой вопрос. Ниже показано сопоставление хранилища ключей / доверенного хранилища и его содержимого

  • хранилище ключей брокера: пара ключей сервера, объединенная в файл PKCS12
  • доверенный склад брокера: root сертификат
  • клиентское хранилище ключей: пара клиентских ключей, объединенная в файл PKCS12
  • клиентское хранилище доверенных сертификатов: root сертификат

Это правильная конфигурация, и сейчас все работает нормально. Не совсем уверен, почему так мало информации о настройке сертификатов для MQTT. Я просмотрел кучу примеров HTTPS и узнал, что сертификаты необходимо добавлять в хранилища ключей и доверенные хранилища, как показано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...