Я пытаюсь настроить RabbitMQ Web Stomp для подписки на очереди RabbitMQ непосредственно с клиентского JavaScript. У меня есть ошибки при попытке использовать SSL с помощью Javascript-клиента RabbitMQ Web Stomp.Ошибка с RabbitMQ + Web STOMP + JavaScript-клиент по HTTPS
Сервер RabbitMQ работает надлежащим образом в контейнере Docker и доступен без проблем через веб-сервер Tomcat, на котором запущена Java Spring на другом контейнере.
Вот конфигурационный файл 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
И докер-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"
При запуске контейнера управление кроликом доступно на порту 15672, d доступны URL-адреса http://192.168.99.100:15674/ws, http://192.168.99.100:15674/stomp и http://192.168.99.100:15674/stomp/info. Те же URL-адреса через HTTPS не работают.
Я также могу взаимодействовать (т. Е. Подключать и отправлять/получать сообщения) с сервером RabbitMQ, используя SSL непосредственно на Java (через порт 5671) из веб-сервера.
Однако, когда я пытаюсь подключиться через Javascript с помощью HTTPS, соединение немедленно закрывается (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 ПОЛУЧИТЬ https://192.168.99.100:15674/stomp/info нетто :: ERR_CONNECTION_CLOSED
Любая идея где я делаю что-то неправильно? Я не эксперт с веб-сокетами или STOMP, и я не разработчик Erlang, поэтому довольно сложно полностью понять эту ошибку. Любая помощь очень ценится!
На стороне сервера RabbitMQ, вот журналы, которые появляются для этого запроса, в результате чего соединение будет закрыто:
RabbitMQ-Server_1 | = ОШИБКА ОТЧЕТА ==== 20-Jun-2016 :: 05: 59: 03 ===
rabbitmq-server_1 | У слушателя ранчо http был запущен процесс соединения с cowboy_protocol: start_link/4 at < 0.27746.0> exit с причиной: {function_clause, [{cowboy_protocol, parse_method, [< >>, {state, # Port < 0.30021>, ranch_tcp, [ cowboy_router, cowboy_handler], false, [{listener, http}, {dispatch, [{'_', [], [{[< < "stomp" >>, '...'], [], sockjs_cowboy_handler, { сервис "/ топать", # Fun, {}, "// cdn.jsdelivr.net/sockjs/1.0.3/sockjs.min.js ", false, true, 5000,25000,131072, # Fun, undefined}}, {[< <" ws ">>], [], rabbit_ws_handler, [{type, text}]}]}]}], неопределенные, неопределенные, 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"}, { линия, 168}]}]}
RabbitMQ-SERVER_1 |
RabbitMQ-сер ver_1 | = ОШИБКА ОТЧЕТА ==== 20-Jun-2016 :: 05: 59: 03 ===
rabbitmq-server_1 | Ошибка в процессе < 0.27747.0> на узле кролика @ 4391a6fed075 с выходным значением:
rabbitmq-server_1 | {function_clause,
rabbitmq-server_1 | [{cowboy_protocol, parse_method,
rabbitmq-server_1 | [< < >>,
rabbitmq-server_1 | {state, # Port < 0.30022>, ranch_tcp,
rabbitmq-server_1 | [cowboy_router, cowboy_handler],
rabbitmq-server_1 | false,
rabbitmq-server_1 | [{слушатель, http},
rabbitmq-server_1 | {рассылка,
rabbitmq-server_1 | [{'_', [],
rabbitmq-server_1 | [{[< < "stomp" >>, '...'],
rabbitmq-server_1 | [], sockjs_cowboy_handler,
rabbitmq-server_1 | {service, "/ stomp",
rabbitmq-server_1 | Fun, {},
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 | {[< <" WS «>>], [], rabbit_ws_handler, [{type, text}]}]}]}],
rabbitmq-server_1 | undefined, undefined, 5,1,100,4096,64,4096,100,5000, 1466402348684},
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,
rabbitmq-server_1 | 113,100,40,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, 111, 80, 0, rabbitmq-server_1 | 23,0,24 >>],
rabbitmq-server_1 | [{файл, "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 в < 0.27747.0> exit с причиной: {function_clause, [{cowboy_protocol, parse_method, [< >>, {state, # Port < 0.30022>, ranch_tcp, [ cowboy_router, cowboy_handler], false, [{listener, http}, {dispatch, [{'_', [], [{[< < "stomp" >>, '...'], [], sockjs_cowboy_handler, { сервис "/ топать", # 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,40,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}]}]}
Спасибо заранее, если кто-нибудь может помочь мне прояснить это.
Благодарим вас за ответ. Но, как я уже упоминал, я уже настроил SSL для RabbitMQ и работает с использованием клиента Java. Проблема возникает при попытке использовать RabbitMQ Web STOMP с SSL (кстати, активируются следующие плагины: rabbitmq_management rabbitmq_stomp rabbitmq_web_stomp). –