Сервер RabbitMQ на RHEL7 сбрасывает SSL-соединение

Я пытался подключиться к серверу RabbitMQ на RHEL7, который прослушивает порт 5671 для SSL-соединений.

RabbitMQ server's SSL listener has been configured like this:
[
  {rabbit, [
     {ssl_listeners, [5671]},
     {ssl_options, [{cacertfile,"/etc/pki/tls/certs/samqp.dcu.ie.chain"},
                {certfile,"/etc/pki/tls/certs/samqp.dcu.ie.crt"},
                {keyfile,"/etc/pki/tls/private/samqp.dcu.ie.key"},
                {verify,verify_peer},
                {fail_if_no_peer_cert,false}]}
   ]}
]

На стороне клиента я получаю это сообщение об исключении:

Клиентская машина - Ubuntu 14.04 LTS.

Клиент - это настраиваемый плагин Moodle, использующий библиотеку videlalvaro / php-amqplib для связи с сервером.

Вот фактические пути и имена файлов для моих самоподписанных сертификатов, созданных в соответствии с документами на: https://www.rabbitmq.com/ssl.html

$sslOptions = array(
            'cafile' => '/home/duro/testca/cacert.pem',
            'local_cert' => '/home/duro/client/key-cert.pem',
            'peer_name'=>'samqp.dcu.ie',
            'verify_peer_name' => true
            );

Очевидно, что в PHP есть требование использовать сертификат и ключ, объединенные в один файл, отсюда и «key-cert.pem».

Вот как я подключаюсь с клиента, включая фактический URL:

$connection = new AMQPSSLConnection('samqp.dcu.ie.crt', 5671, 'rMQUsername', 'rMQPasswd', '/', $sslOptions)

На стороне клиента я получаю это сообщение об исключении:

"stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed" 

На стороне сервера, просматривая /var/log/rabbitmq/[email protected], я вижу эту ошибку:

=ERROR REPORT==== 3-Mar-2016::14:08:26 ===
SSL: certify: ssl_alert.erl:93:Fatal error: unknown ca

Итак, как заставить это соединение работать?


person Đuro Mandinić    schedule 01.03.2016    source источник
comment
Опубликуйте точный URL-адрес, который вы используете для подключения к серверу, и опубликуйте вывод openssl s_client -connect <hostname>:<port> -tls1 -servername <hostname> | openssl x509 -text -noout. Сделайте это, добавив его к своему вопросу, нажав Изменить (и не публикуйте его как комментарий). В противном случае мы не сможем воспроизвести его, а информации для устранения неполадок недостаточно.   -  person jww    schedule 01.03.2016
comment
Я предоставил фактический URL-адрес в коде создания экземпляра $ connection. Я также опубликовал вывод команды и обновил имена файлов и пути до реальных.   -  person Đuro Mandinić    schedule 02.03.2016
comment
Спасибо @Djuro. С помощью этой информации было легко поставить диагноз. Желаю, чтобы все это обеспечили.   -  person jww    schedule 03.03.2016


Ответы (2)


... ошибка: 14090086: подпрограммы SSL: ssl3_get_server_certificate: ошибка проверки сертификата "

Вы подключаетесь к серверу с именем sphinx.dcu.ie:

$connection = new AMQPSSLConnection('sphinx.dcu.ie', 5671, ...)

Однако имя хоста в сертификате - samqp.dcu.ie:

X509v3 Subject Alternative Name: 
    DNS:samqp.dcu.ie

Вам нужно сделать одно из двух. Сначала сделайте запрос RabbitMQ к серверу, указанному в сертификате. Или, во-вторых, получите новый сертификат с тем DNS-именем, которое вы хотите использовать.

Вы можете поместить любое количество DNS-имен в Альтернативное имя субъекта (SAN). Я часто наполняю их названиями для отладки и тестирования, например localhost, localhost.localdomain и 127.0.0.1.


ИЗМЕНИТЬ: для этой проблемы:

... и в журнале сервера теперь написано:

=ERROR REPORT==== 3-Mar-2016::09:52:41 ===
SSL: certify: ssl_handshake.erl:1490:Fatal error: unknown ca

Вам необходимо вернуться к информации для версии 9 или около того вашего вопроса и этой информации:

depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert  High Assurance EV Root CA
verify return:1
depth=1 C = NL, ST = Noord-Holland, L = Amsterdam, O = TERENA, CN =   TERENA SSL High Assurance CA 3
verify return:1
depth=0 businessCategory = Government Entity, jurisdictionC = IE,   serialNumber = Government Entity, street = Glasnevin, street = Dublin City   University, postalCode = IE, C = IE, ST = Ireland, L = Dublin, O = Dublin  City University, OU = ISS, CN = samqp.dcu.ie
verify return:1

Вам не нужен файл ca-cert.pem, который включает сотни центров сертификации, большинство из которых неверны. Вам нужен только один правильный CA, и это когда-то назывался DigiCert High Assurance EV Root CA. Вам также понадобится промежуточный сертификат под названием TERENA SSL High Assurance CA 3.

Корневой ЦС DigiCert High Assurance EV сертификат

Вы можете загрузить DigiCert High Assurance EV Root CA со страницы Сертификаты доверенных корневых центров DigiCert. Он имеет следующие атрибуты:

  • Серийный номер: 02: AC: 5C: 26: 6A: 0B: 40: 9B: 8F: 0B: 79: F2: AE: 46: 25: 77
  • Отпечаток: 5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25

Когда вы загружаете его, он находится в формате DER. Вам необходимо преобразовать его в формат PEM с помощью:

$ openssl x509 -inform der -in DigiCertHighAssuranceEVRootCA.crt \
    -outform PEM -out DigiCertHighAssuranceEVRootCA.pem

Потом:

$ cat DigiCertHighAssuranceEVRootCA.pem 
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
...
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----

Сертификат TERENA SSL High Assurance CA 3

Теперь вам нужно сделать то же самое с TERENA SSL High Assurance CA 3. Думаю, вы можете найти его на TERENA Корневые сертификаты ЦС высокой надежности SSL. Это тот, у которого есть атрибуты:

  • Серийный номер 0b: 5c: 34: 35: 67: 5b: 24: 67: c0: d7: 32: 37: f9: 0d: 5f: 94
  • Отпечаток пальца SHA1 A7: 8A: AB: DE: 7F: 5B: 77: 15: 40: D3: 33: B5: 05: 87: 4C: 82: 04: AA: D2: 06

MY-CACERT.pem

Теперь, когда у вас есть центры сертификации, необходимые для построения пути, выполните следующие действия:

$ cat DigiCertHighAssuranceEVRootCA.pem > my-cacert.pem
$ cat TERENA_SSL_High_Assurance_CA_3.pem >> my-cacert.pem
$ echo "" >> my-cacert.pem

Потом:

$ cat my-cacert.pem 
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
...
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
+OkuE6N36B9K
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE4DCCA8igAwIBAgIQC1w0NWdbJGfA1zI3+Q1flDANBgkqhkiG9w0BAQsFADBs
...
dnnqz5SeAs6cbSm551qG7Dj8+6f/8e33oqLC5Ldnbt0Ou6PjtZ4O02dN9cnicemR
1B0/YQ==
-----END CERTIFICATE-----

Наконец, используйте my-cacert.pem.


У вас должна быть возможность тестировать с помощью s_client OpenSSL. Но я не могу подключиться к внешнему миру:

$ openssl s_client -connect sphinx.dcu.ie:5671 -tls1 \
    -servername sphinx.dcu.ie -CAfile my-cacert.pem 

Если вы можете подключиться, вы должны получить Verify Ok (0) (если я правильно помню).

person jww    schedule 02.03.2016
comment
Обновился снова, если вы это имеете в виду. - person Đuro Mandinić; 03.03.2016
comment
Я решил проблему, удалив «cafile» и «local_cert» из $ sslOptions, оставив «peer_name» и «verify_peer_name». Сообщения отправляются, и запись в журнале выглядит хорошо. Можете ли вы так изменить свой ответ или добавить новый, я приму его. Имеет ли это смысл? - person Đuro Mandinić; 03.03.2016
comment
@DjuroMandinic - Я попытался решить дополнительные проблемы, которые у вас возникли. Я не могу подключиться к sphinx.dcu.ie:5671 из внешнего мира, поэтому не знаю, что это полностью правильно. - person jww; 03.03.2016
comment
В настоящее время не предполагается принимать внешние подключения. Я могу подтвердить, что сервер принимает соединения через прослушиватель SSL на порту 5671 и сообщения принимаются. В файле журнала указано следующее: =INFO REPORT==== 3-Mar-2016::14:48:14 === accepting AMQP connection <0.20455.1> (136.206.4.190:23456 -> 136.206.1.29:5671) =INFO REPORT==== 3-Mar-2016::14:48:14 === closing AMQP connection <0.20455.1> (136.206.4.190:23456 -> 136.206.1.29:5671) - person Đuro Mandinić; 03.03.2016

У меня была такая же проблема при подключении к серверу RabbitMQ из клиента PHP. Ошибка была

"stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed"

Я отлаживал его, выполнив следующие шаги

Убедитесь, что клиент и сервер устанавливают связь с помощью предоставленных файлов сертификатов.

В одном терминале выполните команду ниже, чтобы запустить сервер на порту 8443.

openssl s_server -accept 8443 -cert /etc/rabbitmq/server/cert.pem -key /etc/rabbitmq/server/key.pem -CAfile  /etc/rabbitmq/testca/cacert.pem

И в другом терминале выполните команду ниже, чтобы установить соединение.

openssl s_client -connect YOUR_SERVER:8443 -key /rabbitmq/client/key.pem -CAfile /rabbitmq/client/key-cert.pem

Если клиент может подключиться и не возвращается к приглашению из-за тайм-аута, ваше соединение успешно. Попробуйте использовать свои сертификаты / ключи, пока не установите соединение.

Примечание. Предполагается, что сертификат ключа - это объединенный файл.

# cd /etc/rabbitmq/client
# cat key.pem cert.pem > key-cert.pem

Параметры SSL в клиенте PHP

Я передал ниже массив PHP как параметр $ssl_options.

$ssl_options =  [
                        'cafile' => '/rabbitmq/testca/cacert.pem',
                        'local_cert' => '/rabbitmq/client/key-cert.pem',
                        'verify_peer' => false,
                        'verify_peer_name' => false,
            ];

Мои конфигурации RabbitMQ соответствуют документы по VMWare.

person AnkitK    schedule 12.04.2019