我试图设置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/ws,http://192.168.99.100:15674/stomp和http://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}]}]}
如果有人能帮助我清除这一点,请提前感谢您。
答案 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>