我有一个生活在AWS上的ActiveMQ Broker。我正在尝试使用SSL保护来自客户端的连接。我已将代理设置为使用SSL,但我不太明白客户端应该从哪里获取证书。我是否需要从代理中复制证书并使用客户端代码将其打包?或者每次启动客户端时,我是否以编程方式远程检索证书?
activemq.xml
中的相关SSL设置
<sslContext>
<sslContext keyStore="file:${activemq.base}/conf/broker.ks"
keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts"
trustStorePassword="password"/>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ssl" uri="ssl://0.0.0.0:61714?transport.enabledProtocols=TLSv1.2"/>
</transportConnectors>
连接的客户端将是使用JMS的Java客户端。此时我正在使用随ActiveMQ安装一起提供的默认证书。
ActiveMQ包括引用虚拟自签名证书的密钥和信任存储。为安装创建代理证书和存储时,要么覆盖conf目录中的值,要么删除现有的虚拟密钥和信任存储,以便它们不会干扰)
因此,您应该删除现有的broker.ks
和broker.ts
并为您的安装创建新的。你在这里有几个选择。
我认为AWS拥有某种基础设施来获取SSL证书,并且这些证书将由着名的证书颁发机构签署,这些证书颁发机构将由JMS客户端隐式信任。快速搜索出现了AWS Certificate Manager。
但是,您还可以选择使用“自签名”证书,根据定义,该证书不会由知名证书颁发机构签名,因此必须得到客户的明确信任。
您可以使用以下命令执行自签名路由:
keytool
(来自JDK),为代理创建证书:
keytool -genkey -alias broker -keyalg RSA -keystore broker.ks
keytool -export -alias broker -keystore broker.ks -file broker_cert
keytool -genkey -alias client -keyalg RSA -keystore client.ks
keytool -import -alias broker -keystore client.ts -file broker_cert
启动客户端的VM时,请指定以下系统属性:
javax.net.ssl.trustStorePassword=password
javax.net.ssl.trustStore=/path/to/client.ts
如果选择自签名路由,则只需生成一次client.ts,然后将其复制到每个客户端。每次连接时,客户端都将使用相同的信任库(假设代理的证书不会更改)。