【问题标题】:Error with RabbitMQ + Web STOMP + JavaScript client over HTTPSRabbitMQ + Web STOMP + JavaScript 客户端通过 HTTPS 出错
【发布时间】:2024-05-19 23:10:01
【问题描述】:

我正在尝试设置 RabbitMQ Web Stomp 以直接从客户端 JavaScript 订阅 RabbitMQ 队列。尝试将 SSL 与 RabbitMQ Web Stomp javascript 客户端一起使用时出现错误。

RabbitMQ 服务器在 Docker 容器中正常运行,并且可以通过在另一个容器上运行 Java Spring 的 Tomcat Web 服务器顺利访问。

这里是 RabbitMQ 配置文件:

[
  {rabbit, [ 
             {ssl_listeners, [5671] }, 
             {ssl_options, [ 
               {cacertfile,             "/etc/rabbitmq/ssl/ca/cacert.pem" },
               {certfile,               "/etc/rabbitmq/ssl/server/rabbitmq.cert.pem" },
               {keyfile,                "/etc/rabbitmq/ssl/server/rabbitmq.key.pem" },
               {verify,                 verify_peer},
               {fail_if_no_peer_cert,   false}]},
             {loopback_users, []}
  ]},
  {rabbitmq_web_stomp, [ 
                         {ssl_config, [
                           {port,       15671},
                           {backlog,    1024},
                           {certfile,   "/etc/rabbitmq/ssl/ca/cacert.pem"},
                           {keyfile,    "/etc/rabbitmq/ssl/server/rabbitmq.cert.pem"},
                           {cacertfile, "/etc/rabbitmq/ssl/server/rabbitmq.key.pem"},
                           {password,   "changeme"}
                         ]}
                      ]}
].

Dockerfile 公开了以下端口:

EXPOSE 5671 61613 61614 15671 15672 15674

还有 docker-compose.yml 来设置 RabbitMQ 容器:

  rabbitmq-server:
    build: rabbitmq-ssl
    image: gprevost/rabbitmq-ssl:latest
    ports:
      - "5671:5671"
      - "61613:61613"
      - "61614:61614"
      - "15671:15671"
      - "15672:15672"
      - "15674:15674"

运行容器时,Rabbit Management 在端口 15672 上可用,并且可以访问 URL http://192.168.99.100:15674/wshttp://192.168.99.100:15674/stomphttp://192.168.99.100:15674/stomp/info。无法通过 HTTPS 访问相同的 URL。

我还设法从 Web 服务器后端直接使用 Java 中的 SSL(通过端口 5671)与 RabbitMQ 服务器交互(即连接和发送/接收消息)。

但是,当我尝试使用 HTTPS 通过 Javascript 进行连接时,连接会立即关闭(HTTPS 不仅出于安全目的需要,而且因为该页面是通过 HTTPS 加载的,因此所有 JavaScript 请求都需要确保不被浏览器屏蔽)。这是我使用的代码:

    <script src="//cdnjs.cloudflare.com/ajax/libs/sockjs-client/0.3.4/sockjs.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>

<script th:fragment="script" th:inline="javascript" type="text/javascript">

    $(document).ready(function(e) {
        var ws = new SockJS("https://192.168.99.100:15674/stomp");
        var client = Stomp.over(ws);
    });

</script>

浏览器控制台出现如下错误:

sockjs.min.js:27 GET https://192.168.99.100:15674/stomp/info net::ERR_CONNECTION_CLOSED

知道我在哪里做错了吗?我不是 Web Sockets 或 STOMP 方面的专家,也不是 Erlang 开发人员,因此很难完全理解错误。非常感谢任何帮助!

在 RabbitMQ 服务器端,以下是该请求出现的日志,导致连接关闭:

rabbitmq-server_1 | =错误报告==== 20-Jun-2016::05:59:03 ===

rabbitmq-server_1 |牧场侦听器 http 的连接过程以 cowboy_protocol:start_link/4 在 退出,原因是:{function_clause,[{cowboy_protocol,parse_method,[>,{state,#Port,ranch_tcp,[ cowboy_router,cowboy_handler],false,[{listener,http},{dispatch,[{'_',[],[{[>,'...'],[],sockjs_cowboy_handler,{服务,"/stomp",#Fun,{},"//cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined} },{[>],[],rabbit_ws_handler,[{type,text}]}]}]}],undefined,undefined,5,1,100,4096,64,4096,100,5000, 1466402348682,12115,215,2115,115,2115,215,215,2115,215,215,215,255,215,215,215,215,21985 ,16,192,10,192,20,192,9,192,19,0,53,0,47,0,10,86,0,1,0,0,76,255,1,0,1,0,0,23,0,0 ,0,35,0,0,0,5,0,5,1,0,0,0,0,51,116,0,0,0,18,0,0,0,16,0,20,0 ,18,8,115,112,100,121,47,51,46,49,8,104,116,116,112,47,49,46,49,117,80,0,0,0,11,0,2,1,0,0,10,0,8,0 ,6,0,29,0,23,0,24>>],[{file,"src/cowboy_protocol.erl"} ,{line,168}]}]}

rabbitmq-server_1 |

rabbitmq-server_1 | =错误报告==== 20-Jun-2016::05:59:03 ===

rabbitmq-server_1 |节点 rabbit@4391a6fed075 上的进程 出错,退出值:

rabbitmq-server_1 | {function_clause,

rabbitmq-server_1 | [{cowboy_protocol,parse_method,

rabbitmq-server_1 | [>,

rabbitmq-server_1 | {state,#Port,ranch_tcp,

rabbitmq-server_1 | [cowboy_router,cowboy_handler],

rabbitmq-server_1 |假的,

rabbitmq-server_1 | [{listener,http},

rabbitmq-server_1 | {调度,

rabbitmq-server_1 | [{'_',[],

rabbitmq-server_1 | [{[>,'...'],

rabbitmq-server_1 | [],sockjs_cowboy_handler,

rabbitmq-server_1 | {service,"/stomp",

rabbitmq-server_1 |有趣,{},

rabbitmq-server_1 | "//cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",

rabbitmq-server_1 |假,真,5000,25000,131072,

rabbitmq-server_1 | #Fun,未定义}},

rabbitmq-server_1 | {[>],[],rabbit_ws_handler,[{type,text}]}]}]}],

rabbitmq-server_1 |未定义,未定义,5,1,100,4096,64,4096,100,5000,1466402348684},

rabbitmq-server_1 |

rabbitmq-server_1 | 113,100,140,​​128,201,104,90,3,39,96,30,35,45,2,6,1,46,227,175,146,

rabbitmq-server_1 | 0,0,20,192,10,192,20,0,57,192,9,192,19,0,51,0,53,0,47,0,10,86,0,1,

rabbitmq-server_1 | 0,0,76,255,1,0,1,0,0,23,0,0,0,35,0,0,0,5,0,5,1,0,0,0,0,51,116, 0,0,

rabbitmq-server_1 | 0,18,0,0,0,16,0,20,0,18,8,115,112,100,121,47,51,46,49,8,104,116,

rabbitmq-server_1 | 116,112,47,49,46,49,117,80,0,0,0,11,0,2,1,0,0,10,0,8,0,6,0,29,0,

rabbitmq-server_1 | 23,0,24>>],

rabbitmq-server_1 | [{file,"src/cowboy_protocol.erl"},{line,168}]}]}

rabbitmq-server_1 |

rabbitmq-server_1 | =错误报告==== 20-Jun-2016::05:59:03 ===

rabbitmq-server_1 |牧场侦听器 http 的连接过程以 cowboy_protocol:start_link/4 在 退出,原因是:{function_clause,[{cowboy_protocol,parse_method,[>,{state,#Port,ranch_tcp,[ cowboy_router,cowboy_handler],false,[{listener,http},{dispatch,[{'_',[],[{[>,'...'],[],sockjs_cowboy_handler,{服务,"/stomp",#Fun,{},"//cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined} },{[>],[],rabbit_ws_handler,[{type,text}]}]}]}],undefined,undefined,5,1,100,4096,64,4096,100,5000, 1466402348684},>],[{file,"src/cowboy_protocol.erl "}, {line,168}]}]}

如果有人可以帮助我解决这个问题,请提前感谢您。

【问题讨论】:

    标签: javascript ssl rabbitmq stomp web-stomp


    【解决方案1】:

    当你使用 ssl 时,端口是另一个,对于 http 来说是不一样的。

    您可以使用对我有用的这些步骤进行配置

    http://www.gettingcirrius.com/2013/01/configuring-ssl-for-rabbitmq.html

    【讨论】:

    • 感谢您的回复。但正如我已经提到的,我已经为 RabbitMQ 配置了 SSL,并且它正在使用 Java 客户端工作。当尝试将 RabbitMQ Web STOMP 与 SSL 一起使用时会出现问题(顺便说一下,激活了以下插件:rabbitmq_management rabbitmq_stomp rabbitmq_web_stomp)。
    【解决方案2】:

    确实需要更改端口以使用 SSL(我的配置为 15671),但不断收到“连接被拒绝”错误。

    又过了几个小时,我才发现自己的错误:在我的 Web Stomp 配置中指定了错误的证书。

    错误:
    证书文件:cacert.pem
    密钥文件:rabbitmq.cert.key
    cacertfile: rabbitmqkey.pem

    正确:
    cacertfile:cacert.pem
    证书文件:rabbitmq.cert.key
    密钥文件:rabbitmqkey.pem

    所以,在将 RabbitMQ 配置更改为:

    {rabbitmq_web_stomp, [ 
                             {ssl_config, [
                               {port,       15671},
                               {backlog,    1024},
                               {certfile,   "/etc/rabbitmq/ssl/ca/cacert.pem"},
                               {keyfile,    "/etc/rabbitmq/ssl/server/rabbitmq.cert.pem"},
                               {cacertfile, "/etc/rabbitmq/ssl/server/rabbitmq.key.pem"},
                               {password,   "changeme"}
                             ]}
                          ]}
    

    到:

    {rabbitmq_web_stomp, [ 
                             {ssl_config, [
                               {port,       15671},
                               {backlog,    1024},
                               {cacertfile, "/etc/rabbitmq/ssl/ca/cacert.pem"},
                               {certfile,   "/etc/rabbitmq/ssl/server/rabbitmq.cert.pem"},
                               {keyfile,    "/etc/rabbitmq/ssl/server/rabbitmq.key.pem"},
                               {password,   "changeme"}
                             ]}
                          ]}
    

    并使用端口 15671 连接:

    <script th:fragment="script" th:inline="javascript" type="text/javascript">
    
        $(document).ready(function(e) {
            var ws = new SockJS("https://192.168.99.100:15671/stomp");
            var client = Stomp.over(ws);
        });
    
    </script>
    

    【讨论】:

    • 在一个高流量的服务站点上具有完全相同的配置,并且作为一个魅力。但是,对于 Chrome 56(也是最新的 Firefox),它已经停止工作。 @guillaume-prevost,您的设置是否遇到任何问题?