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

时间:2016-06-20 07:10:18

标签: javascript ssl rabbitmq stomp web-stomp

我试图设置RabbitMQ Web Stomp直接从客户端JavaScript订阅RabbitMQ队列。尝试在RabbitMQ Web Stomp javascript客户端上使用SSL时出错。

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使用相同的网址无法正常工作。

我还设法使用来自Web服务器后端的Java(通过端口5671)直接使用SSL与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套接字或STOMP的专家,而且我不是Erlang开发人员,因此很难完全理解错误。任何帮助非常感谢!

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

  

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

     

rabbitmq-server_1 | Ranch监听器http的连接过程以cowboy_protocol:start_link / 4&lt; 0.27746.0&gt;开始。退出原因:{function_clause,[{cowboy_protocol,parse_method,[&lt;&lt;&gt;&gt;,{state,#Port&lt;&lt;&gt;&gt;&gt;&gt;&#0.30021&gt;,ranch_tcp,[cowboy_router,cowboy_handler],false,[{listener,http}, {调度,[{&#39; _&#39;,[],[{[&LT;&LT;&#34;蹬&#34;&GT;&GT;,&#39; ...&#39], [],sockjs_cowboy_handler,{服务,&#34; /蹬&#34;,#娱乐,{},&#34; // cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js" ,FALSE,TRUE,5000,25000,131072,#娱乐,未定义}},{并[d&LT;&#34; WS&#34;&GT;&GT;],[],rabbit_ws_handler,[{类型,文本}] }]}]}],未定义未定义,5,1,100,4096,64,4096,100,5000,1466402348682},&LT;&LT; 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&GT;&GT;],[{文件, &#34; SRC / cowboy_protocol .erl&#34;},{线,168}]}]}

     

rabbitmq-server_1 |

     

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

     

rabbitmq-server_1 |过程中的错误&lt; 0.27747.0&gt;节点rabbit @ 4391a6fed075上的退出值:

     

rabbitmq-server_1 | {function_clause,

     

rabbitmq-server_1 | [{cowboy_protocol,parse_method,

     

rabbitmq-server_1 |并[d&LT;&GT;&GT;,

     

rabbitmq-server_1 | {状态,#端口&LT; 0.30022&GT;,ranch_tcp,

     

rabbitmq-server_1 | [cowboy_router,cowboy_handler]

     

rabbitmq-server_1 |假,

     

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

     

rabbitmq-server_1 | {调度,

     

rabbitmq-server_1 | [{&#39; _&#39;,[]

     

rabbitmq-server_1 | [{[&LT;&LT;&#34;蹬&#34;&GT;&GT;,&#39; ...&#39],

     

rabbitmq-server_1 | [],sockjs_cowboy_handler,

     

rabbitmq-server_1 | {服务,&#34; /蹬&#34;,

     

rabbitmq-server_1 |乐趣,{},

     

rabbitmq-server_1 | &#34; // cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js",

     

rabbitmq-server_1 | FALSE,TRUE,5000,25000,131072,

     

rabbitmq-server_1 | #娱乐,未定义}},

     

rabbitmq-server_1 | {并[d&LT;&#34; WS&#34;&GT;&GT;],[],rabbit_ws_handler,[{类型,文本}]}]}]}],

     

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

     

rabbitmq-server_1 | &LT;&LT; 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 | 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&GT;&GT],

     

rabbitmq-server_1 | [{文件,&#34; SRC / cowboy_protocol.erl&#34;},{线,168}]}]}

     

rabbitmq-server_1 |

     

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

     

rabbitmq-server_1 | Ranch监听器http已经以cowboy_protocol:start_link / 4&lt; 0.27747.0&gt;开始连接过程。退出原因:{function_clause,[{cowboy_protocol,parse_method,[&lt;&gt;&gt;,{state,#Port&lt;&lt;&gt;&gt;&gt;&gt;&#0.30022&gt;,ranch_tcp,[cowboy_router,cowboy_handler],false,[{listener,http}, {调度,[{&#39; _&#39;,[],[{[&LT;&LT;&#34;蹬&#34;&GT;&GT;,&#39; ...&#39], [],sockjs_cowboy_handler,{服务,&#34; /蹬&#34;,#娱乐,{},&#34; // cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js" ,FALSE,TRUE,5000,25000,131072,#娱乐,未定义}},{并[d&LT;&#34; WS&#34;&GT;&GT;],[],rabbit_ws_handler,[{类型,文本}] }]}]}],未定义未定义,5,1,100,4096,64,4096,100,5000,1466402348684},&LT;&LT; 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&GT;&GT;],[{文件,&#34; SRC / cowboy_protocol。 ERL&#34;},{线,168}]}]}

如果有人能帮助我清除这一点,请提前感谢您。

2 个答案:

答案 0 :(得分:0)

使用ssl时,另一个端口与http不相同。

您可以使用此步骤配置它对我有用

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

答案 1 :(得分:0)

确实需要将端口更改为使用SSL(在我的配置上为15671),但仍然保持&#34; Connection Refused&#34;错误。

仅在几个小时之后我发现了自己的错误:在我的Web Stomp配置中指定了错误的证书。

  

<强> WRONG:
   certfile:cacert.pem
  keyfile:rabbitmq.cert.key
  cacertfile:rabbitmqkey.pem

     

<强>正确:
   cacertfile:cacert.pem
  certfile:rabbitmq.cert.key
  keyfile: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>