В настоящее время я настраиваю кластер RabbitMQ, где требуется, чтобы вся связь внутри кластера была зашифрована.
Я следил за гидом в https://www.rabbitmq.com/clustering-ssl.html - создал файл с сертификатом и ключом и передал аргументы SSL серверу rabbitmq как переменные среды:
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'
RABBITMQ_CTL_ERL_ARGS='-pa /usr/lib/erlang/lib/ssl-7.1/ebin -proto_dist inet_tls -ssl_dist_opt server_certfile /etc/ssl/certs/rabbit.pem'
Сервер запускается нормально и слушает с включенным TLS, но я не могу давать ему какие-либо команды через rabbitmqctl:
# rabbitmqctl status
Status of node rabbit@rabbit01 ...
Error: unable to connect to node rabbit@rabbit01: nodedown
DIAGNOSTICS
===========
attempted to contact: [rabbit@rabbit01]
rabbit@rabbit01:
* connected to epmd (port 4369) on rabbit01
* epmd reports node 'rabbit' running on port 47965
* TCP connection succeeded but Erlang distribution failed
* suggestion: hostname mismatch?
* suggestion: is the cookie set correctly?
* suggestion: is the Erlang distribution using TLS?
Что касается сервера, я не получаю ничего особенного в журналах, кроме совершенно бесполезных:
=ERROR REPORT==== 30-Dec-2015::13:08:58 ===
SSL: hello: tls_handshake.erl:167:Fatal error: insufficient security
Небольшой поиск показал, что это может быть из-за несоответствия набора шифров, но я понял, что они оба будут использовать одну и ту же библиотеку SSL.
Для сборов Erlang включена поддержка SSL, как проверено на https://www.rabbitmq.com/troubleshooting-ssl.html, и я могу установить безопасное соединение с сертификатом с помощью openssl s_server и s_client.
Я не уверен, каким будет следующий шаг к устранению этой проблемы, и не смог найти никаких известных проблем с кластеризацией - к сожалению, большая часть документации RabbitMQ по TLS предназначена для протокола AMQP, а не для внутренней кластеризации.
Я тестировал использование openSSL для подключения к работающему экземпляру RabbitMQ и получил очень похожую ошибку:
# openssl s_client -connect localhost:47965
CONNECTED(00000003)
140004605863584:error:1407742F:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert insufficient security:s23_clnt.c:770:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 295 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
openssl s_client -connect localhost:47965 -tls1_2
CONNECTED(00000003)
140400037775008:error:1409442F:SSL routines:SSL3_READ_BYTES:tlsv1 alert insufficient security:s3_pkt.c:1262:SSL alert number 71
140400037775008:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1451944018
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
Это может быть связано с набором шифров или несоответствием версии TLS (например, клиент ограничен TLSv1, но RabbitMQ настроен на требование TLSv1.2), но также может быть из-за тонких полей использования ключа в сертификате. Последнее особенно сложно заметить.
См. [1] [2] [3] [4] [5].