引入 SSL 时 ActiveMQ 错误证书

Posted

技术标签:

【中文标题】引入 SSL 时 ActiveMQ 错误证书【英文标题】:ActiveMQ bad certificate when introduce SSL 【发布时间】:2020-04-15 22:09:10 【问题描述】:

我正在尝试在我的 ActiveMq 中使用 openwire+ssl。我正在使用 rmohr/activemq 提供的 docker 镜像。

自从 broker_localhost.cert 过期后,我运行以下命令来生成必要的文件。

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
keytool -export -alias client -keystore client.ks -file client_cert
keytool -import -alias client -keystore broker.ts -file client_cert

然后在activemq.xml我加了:

<sslContext keyStore="file:$activemq.base/certs/ActiveMq/broker.ks"
      keyStorePassword="password" trustStore="file:$activemq.base/certs/ActiveMq/broker.ts"
      trustStorePassword="password"/>

还有:

<transportConnector name="openwire+ssl" uri="ssl://0.0.0.0:61617?transport.enabledProtocols=TLSv1"/>

当我运行 docker compose 创建 ActiveMQ 实例时,我添加了一个环境变量:

environment:
      - ACTIVEMQ_SSL_OPTS="-Djavax.net.ssl.keyStore=/opt/activemq/certs/ActiveMq/broker.ks -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore=/opt/activemq/certs/ActiveMq/broker.ts -Djavax.net.ssl.trustStorePassword=password -Djavax.net.debug=ssl,handshake"

之后,我将前面步骤中生成的 broker_cert 在 Windows Manage user certificates 中导入为Trusted Root Certification Authorities

然后我构建我的 Asp.Net Core 项目以访问 ActiveMQ 代理

var uri = new Uri(@"ssl://localhost:61617?trace=true&needClientAuth=true&transport.serverName='MoveQ Broker'");
ITransportFactory sslTransportFactory = new SslTransportFactory();
((SslTransportFactory)sslTransportFactory).SslProtocol = "Tls";
ITransport transport = sslTransportFactory.CreateTransport(uri);
_connection = new Connection(uri, transport, new IdGenerator());
((Connection)_connection).UserName = "username";
((Connection)_connection).Password = "password";
_session = _connection.CreateSession(AcknowledgementMode.AutoAcknowledge);

但是我一直在得到

activemq | WARN | Transport Connection to: tcp://172.17.0.1:35356 failed: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate

谁能帮忙看看我可能遗漏了哪些步骤?

【问题讨论】:

您真的需要 2-way SSL 还是 1-way SSL 就足够了? 我认为一种方式就足够了,就像 https 的工作原理一样 【参考方案1】:

如果您只需要单向 SSL 并且您正在使用自签名证书,那么您不需要代理上的信任库或客户端上的密钥库。您只需要代理上的密钥库和客户端上的信任库。像这样生成这些资源:

keytool -genkey -keystore broker-keystore.ks
keytool -export -keystore broker-keystore.ks -file broker.cer
keytool -import -keystore client-truststore.ks -file broker.cer

然后在代理上使用broker-keystore.ks,在客户端上使用client-truststore.ks

【讨论】:

嗨贾斯汀,感谢您提供建议。我不确定如何在客户端上应用 client-truststore.ks。我目前有一个运行 ActiveMQ 服务器的 docker 映像,然后使用主机中的应用程序将消息发布到 ActiveMQ 服务器。谢谢 顺便说一句,我的应用程序是用 C# 编写的,而不是 JAVA 在c#中实现,我们可以指定ClientCertFilename和ClientCertPassword,我这里要写client-truststore.ks和它的密码吗? 我不熟悉 C# 客户端的 SSL 配置,因此您需要参考您的客户端文档了解该部分。也就是说,keytool 默认使用的 JKS 格式是为 Java 应用程序制作的,因此您可能需要将其转换为另一种格式才能与您的 C# 客户端一起使用。同样,您需要查阅客户端文档以了解它支持哪些格式。 谢谢贾斯汀。最终,我通过使用 NMSConnectionFactory 使它与 C# 应用程序一起工作。将我的 C# 应用程序连接到 ActiveMQ 时不再出现错误。非常感谢

以上是关于引入 SSL 时 ActiveMQ 错误证书的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ javax.net.ssl.sslhandshakeexception null 证书链

[转]关于python出现ssl:certificate_verify_failed问题

启用 SSL 证书后,woocommerce 结帐时仍然出现 SSL 连接错误

让git忽略SSL证书错误。及push项目时消除警告

python3 urllib.requesturlopen 一个https 时ssl证书错误!

python3 urllib.requesturlopen 一个https 时ssl证书错误!