2016-03-01 5 views
3

Я пытался подключиться к серверу RabbitMQ на RHEL7, который слушает порт 5671 для SSL-соединений.Сервер RabbitMQ на RHEL7 сбрасывает соединение 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, очевидно, имеет требование использовать сертификат и ключ сцепляются в один файл, следовательно, «кнопочная 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" 

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

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

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

+1

Пожалуйста, укажите точный URL-адрес, который вы используете для подключения к серверу, и опубликуйте вывод 'openssl s_client -connect : -tls1 -servername | openssl x509 -text -noout'. Сделайте это, добавив его в свой вопрос, нажав * Edit * (и не публикуйте его в качестве комментария). В противном случае мы не сможем воспроизвести его, и нет достаточной информации, чтобы помочь устранить ее. – jww

+0

Я поставил фактический URL-адрес в код экземпляра $ connection. Я также разместил вывод команды и обновил имена файлов и пути к реальным. –

+0

Спасибо @ Djuro. Информация была легко диагностирована. Я желаю, чтобы все это предоставили. – jww

ответ

1

... error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed"

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

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

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

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

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

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


EDIT: Для этого выпуска:

... and server's log now says:

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

Вы должны вернуться к информации для Revision 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 Root CAсертификат

Вы можете скачать DigiCert High Assurance EV Root CA от DigiCert Trusted Root Authority Certificates. Она имеет следующие атрибуты:

  • Серийный номер: 02: AC: 5C: 26: 6A: 0B: 40: 9B: 8F: 0B: 79: F2: АЕ: 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 High Assurance CA Root Certificates. Его один с атрибутами:

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

my- CACERT.PEM

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

$ 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.


Вы должны быть в состоянии проверить вещи с помощью OpenSSL, s_client. Но я не могу соединиться с внешним миром:

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

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

+0

Нет, это не сработает. Я обновил вопрос. –

+0

Обновлено, если это то, что вы имеете в виду. –

+0

Я решил проблему, удалив «cafile» и «local_cert» из $ sslOptions, я сохранил «peer_name» и «verify_peer_name». Сообщения идут, и запись в журнале выглядит хорошо. Можете ли вы изменить свой ответ так или добавить новый, я соглашусь с ним. Имеет ли это смысл? –