【问题标题】:RabbitMQ - Trust store lets all the connections throughRabbitMQ - 信任存储允许所有连接通过
【发布时间】:2019-08-06 07:45:48
【问题描述】:

我遇到了 RabbitMQ 的 Trust Store 的问题。 我已经安装了 github 上显示的插件,插件确实加载了,当我将证书放入白名单文件夹时它甚至会响应(如果我删除了像私钥这样的错误 cert.pem,我会收到一个错误响应,即证书是'不是证书,如果我放弃一个好的证书,我会得到这样的响应:信任存储:加载证书'cert.pem') - 这很好。 但是,这就是问题开始的地方。即使白名单文件夹中没有证书,我与我的 Java 客户端建立的 MQTT 和 AMQP 连接也会通过。如果我正确理解了整个插件的想法,那么只有在白名单文件夹中存在证书时才应该通过它们,否则它们不应该。

有人碰巧遇到同样的事情吗?

技术:Docker 上的 RabbitMQ,使用 ssl 的 bouncycastle 库的 Java 客户端

// 编辑 插件:Rabbitmq.config 文件

[
    { rabbit, [
    { loopback_users, [ ] },
    {ssl_handshake_timeout, 100000},
            { tcp_listeners, [ 5672 ] },
            { ssl_listeners, [ 5671 ] },
            { ssl_options, [
                    { cacertfile, "/etc/tls/cacert.pem" },
                    { certfile, "/etc/tls/cert.pem" },
        { keyfile, "/etc/tls/key.pem" },
        { verify, verify_peer },
                    { fail_if_no_peer_cert, true },
        { reuse_sessions, false}
            ] },
            { default_pass, <<"guest">> },
            { default_user, <<"guest">> },
            { default_vhost, <<"/">> },
            { hipe_compile, false }
    ] },
    { rabbitmq_management, [ { listener, [
            { port, 15671 },
            { ssl, true },
            { ssl_opts, [
                    { cacertfile, "/etc/tls/cacert.pem" },
                    { certfile, "/etc/tls/cert.pem" },
                    { fail_if_no_peer_cert, false },
                    { keyfile, "/etc/tls/key.pem" },
                    { verify, verify_peer }
            ] }
    ] } ] },
    { rabbitmq_mqtt, [
            { vhost, <<"/">> },
            { exchange, <<"amq.topic">> },
            { default_user, <<"guest">> },
            { default_pass, <<"guest">> },
            { tcp_listeners, [ 1883 ] },
            { ssl_listeners, [ 8883 ] }
    ] },
    {rabbitmq_trust_store, [
         {directory,        "/etc/whitelist"}, 
         {refresh_interval, {seconds, 30}},
         {log_levels, [{connection, debug}, {channel, debug}, {federation, debug}]}
    ]}
].

【问题讨论】:

    标签: java rabbitmq whitelist truststore


    【解决方案1】:

    根据提供的信息量有限,我几乎是在猜测,但您可能没有配置 TLS 来验证客户端的证书。您需要使用verify_peer RabbitMQ 配置选项。我们有全面的文档,我建议您阅读 - https://www.rabbitmq.com/ssl.htmlhttps://www.rabbitmq.com/troubleshooting-ssl.html

    另外请注意,您列入白名单的证书是用于签署您的应用程序提供的客户端证书的 CA 证书,而不是客户端证书本身。

    最后,快速获得帮助的最佳方式是提供一组文件,供他人用来运行 RabbitMQ 和一个测试应用程序以查看问题。


    注意:RabbitMQ 团队会监控 rabbitmq-users mailing list,并且有时只回答 * 上的问题。

    【讨论】:

    • 抱歉回复晚了,我在帖子中添加了一个配置文件。它仍然通过一切。我忘了提,证书是自签名的。
    • 您确定您的代码连接到端口 5671 吗?您是否在不使用信任库的情况下尝试过此操作?
    • 5671 用于 SSL AMQP,对吗?我必须使用 SSL MQTT 协议,因此我使用 8883 端口。我试过连接和不连接信任库插件,结果是一样的——我可以毫无问题地连接(即使信任库白名单文件夹是空的)
    • 您是否尝试过使用 AMQP 客户端的 TLS AMQP 端口?我将仔细检查如何为 MQTT 配置 TLS,因为我很惊讶它没有 ssl_options 部分。
    • 您应该使用these instructions 来确保为所有启用了 TLS 的端口正确配置了 TLS。 openssl 在这里是一个有用的工具。