Документ создан: 14.05.2019

STOMP+SSL.

Настройка

Пользовательский сертификат НЕ требуется

  • Создаём хранилище (keystore) с самоподписанным серверным сертификтом:
    keytool -genkey -alias amq-server -keyalg RSA -keysize 2048 -validity 90 -keystore amq-server.ks
  • В "activemq.xml" в секцию "transportConnectors" добавляем:
    <transportConnector name="stomp+ssl" uri="stomp+ssl://0.0.0.0:61617?needClientAuth=false" />

    создаём (при отсутствии) секцию "sslContext":

    <sslContext>
            <sslContext keyStore="file:${activemq.base}/conf/ssl-stomp.ks" keyStorePassword="123456" />
    </sslContext>

Пользовательский сертификат требуется

  • Для сервера:
    • Создаём хранилище (keystore) с самоподписанным серверным сертификтом:
      keytool -genkey -alias amq-server -keyalg RSA -keysize 2048 -validity 90 -keystore amq-server.ks
    • Экспортируем сертификат, который нужно будет отдать клиенту для добавления им этого сертификата в хранилище доверенных сертификатов (trustedstore):
      keytool -export -alias amq-server -keystore amq-server.ks -file amq-server_cert
      • Передаём клиенту файл "amq-server_cert".
  • Для клиента:
    • Создаём хранилище (keystore) с самоподписанным клиентским сертификтом:
      keytool -genkey -alias amq-client -keyalg RSA -keysize 2048 -validity 90 -keystore amq-client.ks
    • Импортируем серверный сертификат в хранилище доверенных сертификатов (trustedstore):
      keytool -import -alias amq-server -keystore amq-client.ts -file amq-server_cert
    • Экспортируем сертификат, который нужно будет отдать серверу для добавления им этого сертификата в хранилище доверенных сертификатов (trustedstore) :
      keytool -export -alias amq-client -keystore amq-client.ks -file amq-client_cert
  • Для сервера:
    • Импортируем клиентский сертификат в хранилище доверенных сертификатов (trustedstore):
      keytool -import -alias amq-client -keystore amq-server.ts -file amq-client_cert
      • Копируем файлы "amq-server.ks" и "amq-server.ts" в "${ACTIVEMQ_HOME}/conf/" на сервере ActiveMQ.
  • В "activemq.xml" в секцию "transportConnectors" добавляем:
    <transportConnector name="stomp+ssl" uri="stomp+ssl://0.0.0.0:61617?needClientAuth=true" />

    создаём (при отсутствии) секцию "sslContext":

    <sslContext>
            <sslContext keyStore="file:${activemq.base}/conf/amq-server.ks"
                                    keyStorePassword="123456"
                                    trustStore="file:${activemq.base}/conf/amq-server.ts"
                                    trustStorePassword="123456"
            />
    </sslContext>

Общие действия

Если всё нормально, то в логах вы увидите, что listener запустился:

2019-05-14 10:21:21,149 | INFO  | Listening for connections at: ssl://activemq_host:61617?needClientAuth=true | org.apache.activemq.transport.TransportServerThreadSupport | main
2019-05-14 10:21:21,149 | INFO  | Connector ssl started | org.apache.activemq.broker.TransportConnector | main

Тестирование

Пользовательский сертификат НЕ требуется

Для тестирования можно использовать такой ruby-код:

stomp-ssl-test.rb
#!/usr/bin/ruby
 
require 'rubygems'
require 'stomp'
 
connection = {:hosts => [ {:login => "user", :passcode => "password", :host => "activemq_host", :port => "61617", :ssl => true} ]}
 
@connection = Stomp::Connection.open(connection)
 
@connection.subscribe("/queue/foo")
 
40.times {|i|
  @connection.publish("/queue/foo", "*" * 200)
}
 
@connection.publish("/queue/foo", "end")
 
msg = nil
count = 0
 
until msg == "end"
        msg = @connection.receive.body
 
        puts msg
 
        puts count if (count += 1) % 40 == 0
 
end

Пользовательский сертификат требуется

Для тестирования можно использовать такой ruby-код:

stomp-ssl-test.rb
#!/usr/bin/ruby
 
require 'rubygems'
require 'stomp'
 
client_cert_file = "./cert.pem"
client_key_file  = "./key.pem"
ssl_params = Stomp::SSLParams.new(:cert_file => client_cert_file, :key_file => client_key_file)
connection = {:hosts => [ {:login => "user", :passcode => "password", :host => "activemq_host", :port => "61617", :ssl => ssl_params} ]}
 
@connection = Stomp::Connection.open(connection)
 
@connection.subscribe("/queue/foo")
 
40.times {|i|
  @connection.publish("/queue/foo", "*" * 200)
}
 
@connection.publish("/queue/foo", "end")
 
msg = nil
count = 0
 
until msg == "end"
        msg = @connection.receive.body
 
        puts msg
 
        puts count if (count += 1) % 40 == 0
 
end

Получить "client_cert_file" и "client_key_file" можно из "amq-client.ks". Действия странные, но для java-клиента они не требуются, т.к. он примет "amq-client.ks" в том виде, что есть. Но для ruby нужно выполнять преобразование. Итак:

  • Сначала выгрузим в PKCS12:
    keytool -importkeystore -srckeystore amq-client.ks -destkeystore keystore.p12 -deststoretype PKCS12
  • Затем извлечём ключ:
    openssl pkcs12 -in keystore.p12  -nodes -nocerts -out key.pem
  • Извлечём сертификат:
    openssl pkcs12 -in keystore.p12  -nokeys -out cert.pem

Вроде, всё.

 
Top.Mail.Ru
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate