简体   繁体   English

RabbitMQ + Web STOMP + JavaScript客户端通过HTTPS出错

[英]Error with RabbitMQ + Web STOMP + JavaScript client over HTTPS

I'm trying to set up RabbitMQ Web Stomp to subscribe to RabbitMQ queues directly from client-side JavaScript. 我正在尝试设置RabbitMQ Web Stomp直接从客户端JavaScript订阅RabbitMQ队列。 I have errors when trying to use SSL with the RabbitMQ Web Stomp javascript client. 尝试在RabbitMQ Web Stomp javascript客户端上使用SSL时出错。

The RabbitMQ server is running properly in a Docker container, and is accessed without troubles via the Tomcat web server running Java Spring on another container. RabbitMQ服务器在Docker容器中正常运行,并且可以通过在另一个容器上运行Java Spring的Tomcat Web服务器轻松访问。

Here is the RabbitMQ configuration file: 这是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"}
                         ]}
                      ]}
].

The Dockerfile exposes the following ports: Dockerfile公开以下端口:

EXPOSE 5671 61613 61614 15671 15672 15674

And the docker-compose.yml to set up the RabbitMQ container: 还有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"

When running the container, the Rabbit Management is available on port 15672, and the URLs http://192.168.99.100:15674/ws , http://192.168.99.100:15674/stomp and http://192.168.99.100:15674/stomp/info are accessible. 当运行容器,兔年管理可用端口15672,以及网址http://192.168.99.100:15674/wshttp://192.168.99.100:15674/stomphttp://192.168.99.100:15674 / stomp / info是可访问的。 The same URLs via HTTPS don't work. 通过HTTPS使用相同的URL无效。

I also manage to interact (ie connect and send/receive messages) with the RabbitMQ server using SSL directly in Java (via port 5671) from the web server back-end. 我还设法使用来自Web服务器后端的Java(通过端口5671)直接使用SSL与RabbitMQ服务器进行交互(即连接和发送/接收消息)。

However, when I try to connect via Javascript using the HTTPS, the connection gets closed immediately (HTTPS is required not only for security purposes, but also because the page is loaded via HTTPS so all JavaScript requests need to be secured to not be blocked by the browser). 但是,当我尝试使用HTTPS通过Javascript连接时,连接立即关闭(HTTPS不仅是出于安全目的,还因为页面是通过HTTPS加载的,因此所有JavaScript请求都需要保护以免被阻止浏览器)。 Here is the code I use: 这是我使用的代码:

    <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>

The following error appears in the browser's console: 浏览器控制台中出现以下错误:

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

Any idea where I'm doing things wrong? 知道我做错了什么吗? I'm not an expert with Web Sockets or STOMP, and I'm not an Erlang developer, which makes it pretty hard to fully understand the error. 我不是Web套接字或STOMP的专家,而且我不是Erlang开发人员,因此很难完全理解错误。 Any help greatly appreciated ! 任何帮助非常感谢!

On the RabbitMQ server side, here are the logs that appear for that request, causing the connection to be closed: 在RabbitMQ服务器端,以下是为该请求显示的日志,导致连接关闭:

rabbitmq-server_1 | rabbitmq-server_1 | =ERROR REPORT==== 20-Jun-2016::05:59:03 === =错误报告==== 2016年6月20日:: 05:59:03 ===

rabbitmq-server_1 | rabbitmq-server_1 | Ranch listener http had connection process started with cowboy_protocol:start_link/4 at <0.27746.0> exit with reason: {function_clause,[{cowboy_protocol,parse_method,[<<>>,{state,#Port<0.30021>,ranch_tcp,[cowboy_router,cowboy_handler],false,[{listener,http},{dispatch,[{'_',[],[{[<<"stomp">>,'...'],[],sockjs_cowboy_handler,{service,"/stomp",#Fun,{},"//cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined}},{[<<"ws">>],[],rabbit_ws_handler,[{type,text}]}]}]}],undefined,undefined,5,1,100,4096,64,4096,100,5000,1466402348682},<<22,3,1,0,137,1,0,0,133,3,2,124,30,85,16,113,253,213,38,165,219,181,225,215,84,87,194,106,235,193,207,37,26,166,115,208,87,3,91,89,138,121,207,0,0,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"} Ranch监听器http的连接过程以cowboy_protocol:start_link / 4 <0.27746.0>退出,原因为:{function_clause,[{cowboy_protocol,parse_method,[<< >>,{state,#Port <0.30021>,ranch_tcp,[ cowboy_router,cowboy_handler],假,[{监听器,HTTP},{调度,[{ '_',[],[{[<< “跺脚” >>, '...'],[],sockjs_cowboy_handler,{服务 “/跺脚”,#玩转,{},“// cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined} },{[<< “WS” >>],[],rabbit_ws_handler,[{类型,文本}]}]}]}],未定义未定义,5,1,100,4096,64,4096,100,5000, 1466402348682},<< 22,3,1,0,137,1,0,0,133,3,2,124,30,85,16,113,253,213,38,165,219,181,225,215,84,87,194,106,235,193,207,37,26,166,115,208,87,3,91,89,138,121,207,0,0 ,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 >>],[{文件, “SRC / cowboy_protocol.erl”} ,{line,168}]}]} {线,168}]}]}

rabbitmq-server_1 | rabbitmq-server_1 |

rabbitmq-server_1 | rabbitmq-server_1 | =ERROR REPORT==== 20-Jun-2016::05:59:03 === =错误报告==== 2016年6月20日:: 05:59:03 ===

rabbitmq-server_1 | rabbitmq-server_1 | Error in process <0.27747.0> on node rabbit@4391a6fed075 with exit value: 节点rabbit @ 4391a6fed075上的进程<0.27747.0>出错,退出值为:

rabbitmq-server_1 | rabbitmq-server_1 | {function_clause, {function_clause,

rabbitmq-server_1 | rabbitmq-server_1 | [{cowboy_protocol,parse_method, [{cowboy_protocol,parse_method,

rabbitmq-server_1 | rabbitmq-server_1 | [<<>>, [<< >>,

rabbitmq-server_1 | rabbitmq-server_1 | {state,#Port<0.30022>,ranch_tcp, {状态,#端口<0.30022>,ranch_tcp,

rabbitmq-server_1 | rabbitmq-server_1 | [cowboy_router,cowboy_handler], [cowboy_router,cowboy_handler]

rabbitmq-server_1 | rabbitmq-server_1 | false, 假,

rabbitmq-server_1 | rabbitmq-server_1 | [{listener,http}, [{听者,HTTP}

rabbitmq-server_1 | rabbitmq-server_1 | {dispatch, {调度,

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

rabbitmq-server_1 | rabbitmq-server_1 | [{[<<"stomp">>,'...'], [{[<< “跺脚” >>, '...'],

rabbitmq-server_1 | rabbitmq-server_1 | [],sockjs_cowboy_handler, [],sockjs_cowboy_handler,

rabbitmq-server_1 | rabbitmq-server_1 | {service,"/stomp", {服务 “/跺脚”,

rabbitmq-server_1 | rabbitmq-server_1 | Fun,{}, 娱乐,{},

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

rabbitmq-server_1 | rabbitmq-server_1 | false,true,5000,25000,131072, 假的,真正的,5000,25000,131072,

rabbitmq-server_1 | rabbitmq-server_1 | #Fun,undefined}}, #娱乐,不确定}},

rabbitmq-server_1 | rabbitmq-server_1 | {[<<"ws">>],[],rabbit_ws_handler,[{type,text}]}]}]}], {[<< “WS” >>],[],rabbit_ws_handler,[{类型,文本}]}]}]}],

rabbitmq-server_1 | rabbitmq-server_1 | undefined,undefined,5,1,100,4096,64,4096,100,5000,1466402348684}, 不确定的,不确定的,5,1,100,4096,64,4096,100,5000,1466402348684},

rabbitmq-server_1 | rabbitmq-server_1 | <<22,3,1,0,141,1,0,0,137,3,2,82,175,8,177,50,73,15,108,57,27,92,102, << 22,3,1,0,141,1,0,0,137,3,2,82,175,8,177,50,73,15,108,57,27,92,102,

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, 113,100,140,​​128,201,104,90,3,39,96,30,35,45,2,6,1,46,227,175,146,

rabbitmq-server_1 | 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, 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 | 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, 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 | 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, 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 | 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, 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 | rabbitmq-server_1 | 23,0,24>>], 23,0,24 >>]

rabbitmq-server_1 | rabbitmq-server_1 | [{file,"src/cowboy_protocol.erl"},{line,168}]}]} [{文件, “SRC / cowboy_protocol.erl”},{线,168}]}]}

rabbitmq-server_1 | rabbitmq-server_1 |

rabbitmq-server_1 | rabbitmq-server_1 | =ERROR REPORT==== 20-Jun-2016::05:59:03 === =错误报告==== 2016年6月20日:: 05:59:03 ===

rabbitmq-server_1 | rabbitmq-server_1 | Ranch listener http had connection process started with cowboy_protocol:start_link/4 at <0.27747.0> exit with reason: {function_clause,[{cowboy_protocol,parse_method,[<<>>,{state,#Port<0.30022>,ranch_tcp,[cowboy_router,cowboy_handler],false,[{listener,http},{dispatch,[{'_',[],[{[<<"stomp">>,'...'],[],sockjs_cowboy_handler,{service,"/stomp",#Fun,{},"//cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined}},{[<<"ws">>],[],rabbit_ws_handler,[{type,text}]}]}]}],undefined,undefined,5,1,100,4096,64,4096,100,5000,1466402348684},<<22,3,1,0,141,1,0,0,137,3,2,82,175,8,177,50,73,15,108,57,27,92,102,113,100,140,128,201,104,90,3,39,96,30,35,45,2,6,1,46,227,175,146,0,0,20,192,10,192,20,0,57,192,9,192,19,0,51,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"}, Ranch监听器http的连接过程以cowboy_protocol:start_link / 4 <0.27747.0>退出,原因为:{function_clause,[{cowboy_protocol,parse_method,[<< >>,{state,#Port <0.30022>,ranch_tcp,[ cowboy_router,cowboy_handler],假,[{监听器,HTTP},{调度,[{ '_',[],[{[<< “跺脚” >>, '...'],[],sockjs_cowboy_handler,{服务 “/跺脚”,#玩转,{},“// cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",false,true,5000,25000,131072,#Fun,undefined} },{[<< “WS” >>],[],rabbit_ws_handler,[{类型,文本}]}]}]}],未定义未定义,5,1,100,4096,64,4096,100,5000, 1466402348684},<< 22,3,1,0,141,1,0,0,137,3,2,82,175,8,177,50,73,15,108,57,27,92,102,113,100,140,​​128,201,104,90,3,39,96,30,35 ,45,2,6,1,46,227,175,146,0,0,20,192,10,192,20,0,57,192,9,192,19,0,51,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 >>],[{文件,“SRC / cowboy_protocol.erl “}, {line,168}]}]} {线,168}]}]}

Thank you in advance if anyone can help me clear this up. 如果有人能帮助我清除这一点,请提前感谢您。

When you use ssl the port is another is not the same for http. 当你使用ssl时,另一个端口对于http来说是不一样的。

you can configure using this steps it worked for me 你可以使用这个步骤配置它对我有用

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

The port indeed needs to be changed to use SSL (15671 on my configuration), but kept getting "Connection Refused" error. 确实需要将端口更改为使用SSL(我的配置为15671),但仍然出现“连接已拒绝”错误。

Only after a few more hours I noticed my own mistake: the wrong certificates were specified in my Web Stomp configuration. 仅仅几个小时后我就发现了自己的错误:在我的Web Stomp配置中指定了错误的证书。

WRONG: 错误:
certfile: cacert.pem certfile:cacert.pem
keyfile: rabbitmq.cert.key keyfile:rabbitmq.cert.key
cacertfile: rabbitmqkey.pem cacertfile:rabbitmqkey.pem

CORRECT: 正确:
cacertfile: cacert.pem cacertfile:cacert.pem
certfile: rabbitmq.cert.key certfile:rabbitmq.cert.key
keyfile: rabbitmqkey.pem keyfile:rabbitmqkey.pem

So, it worked after changing the RabbitMQ configuration from: 因此,在更改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"}
                         ]}
                      ]}

to: 至:

{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"}
                         ]}
                      ]}

and connecting using port 15671: 并使用端口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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM