RabbitMQ: handshake-Fehler beim verwenden von SSL-Zertifikaten
Ich versuche, verwenden Sie SSL-Zertifikate mit RabbitMQ aber ich bekomme den handshake Fehler mit dem Makler.
Zertifikate, die ich generiert haben, funktionieren gut bei der Verwendung der openssl 's_client' und 's_server" - Befehle in separaten terminal-Fenster und die Verwendung von port 8443, wie in der SSL-Anleitung zur Fehlerbehebung (http://www.rabbitmq.com/troubleshooting-ssl.html).
Das problem erscheint, wenn ich versuche, die Verbindung zum RabbitMQ-SSL-port 5671 mit der gleichen openssl "s_client' Befehl:
Auszuführen:
openssl s_client -connect localhost:5671 -cert /etc/rabbitmq/ssl/client/cert.pem -key /etc/rabbitmq/ssl/client/key.pem -CAfile /etc/rabbitmq/ssl/certificate_auth/cacert.pem
Produziert dies:
CONNECTED(00000003)
depth=1 CN = RMQCA
verify return:1
depth=0 CN = roger.xxxxxx.com, O = server
verify return:1
139997248210760:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1256:SSL alert number 40
139997248210760:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
Der SSL-listener startet fein, wie dies in dem RabbitMQ-log:
=INFO REPORT==== 19-May-2014::15:45:34 ===
started TCP Listener on [::]:5672
=INFO REPORT==== 19-May-2014::15:45:34 ===
started SSL Listener on [::]:5671
Beim Versuch, eine Verbindung zu port 5671 mit 's_client Fehler erscheint:
=INFO REPORT==== 19-May-2014::17:20:39 ===
accepting AMQP connection <0.3263.0> ([::1]:58538 -> [::1]:5671)
=ERROR REPORT==== 19-May-2014::17:20:39 ===
SSL: certify: ssl_handshake.erl:1346:Fatal error: handshake failure
=ERROR REPORT==== 19-May-2014::17:20:44 ===
error on AMQP connection <0.3263.0>: {ssl_upgrade_error,
{tls_alert,"handshake failure"}} (unknown POSIX error)
RabbitMQ Config-Datei:
[
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile, "/etc/rabbitmq/ssl/certificate_auth/cacert.pem"},
{certfile, "/etc/rabbitmq/ssl/server/cert.pem"},
{keyfile, "/etc/rabbitmq/ssl/server/key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, false}]}
]}
].
RabbitMQ info:
[{pid,10375},
{running_applications,
[{rabbitmq_management,"RabbitMQ Management Console","3.2.3"},
{rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.2.3"},
{webmachine,"webmachine","1.10.3-rmq3.2.3-gite9359c7"},
{mochiweb,"MochiMedia Web Server","2.7.0-rmq3.2.3-git680dba8"},
{rabbitmq_management_agent,"RabbitMQ Management Agent","3.2.3"},
{rabbit,"RabbitMQ","3.2.3"},
{ssl,"Erlang/OTP SSL application","5.3.3"},
{public_key,"Public key infrastructure","0.21"},
{crypto,"CRYPTO version 2","3.2"},
{asn1,"The Erlang ASN1 compiler version 2.0.4","2.0.4"},
{os_mon,"CPO CXC 138 46","2.2.14"},
{inets,"INETS CXC 138 49","5.9.8"},
{mnesia,"MNESIA CXC 138 12","4.11"},
{amqp_client,"RabbitMQ AMQP Client","3.2.3"},
{xmerl,"XML parser","1.3.6"},
{sasl,"SASL CXC 138 11","2.3.4"},
{stdlib,"ERTS CXC 138 10","1.19.4"},
{kernel,"ERTS CXC 138 10","2.16.4"}]},
{os,{unix,linux}},
{erlang_version,
"Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:30] [hipe] [kernel-poll:true]\n"},
{memory,
[{total,43812088},
{connection_procs,5616},
{queue_procs,42528},
{plugins,451248},
{other_proc,13805200},
{mnesia,72752},
{mgmt_db,10208},
{msg_index,34560},
{other_ets,1159472},
{binary,1030272},
{code,21819091},
{atom,793505},
{other_system,4587636}]},
{vm_memory_high_watermark,0.4},
{vm_memory_limit,787819724},
{disk_free_limit,50000000},
{disk_free,31267266560},
{file_descriptors,
[{total_limit,924},{total_used,4},{sockets_limit,829},{sockets_used,2}]},
{processes,[{limit,1048576},{used,215}]},
{run_queue,0},
{uptime,7893}]
...done.
Jegliche Hilfe würde sehr geschätzt werden
Vielen Dank im Voraus.
UPDATE:
Bekomme ich den folgenden Fehler, wenn Sie versuchen, eine Verbindung mit dem rabbitmqadmin-Dienstprogramm.
Log-Datei:
=INFO REPORT==== 20-May-2014::14:39:12 ===
accepting AMQP connection <0.16589.0> ([::1]:58922 -> [::1]:5671)
=ERROR REPORT==== 20-May-2014::14:39:12 ===
SSL: certify: ssl_handshake.erl:1346:Fatal error: handshake failure
=ERROR REPORT==== 20-May-2014::14:39:17 ===
error on AMQP connection <0.16589.0>: {ssl_upgrade_error,
{tls_alert,"handshake failure"}} (unknown POSIX error)
Den rabbitmqadmin Befehl erzeugt die folgende:
*** Could not connect: [Errno 1] _ssl.c:492: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
- Erleben Sie diese Frage mit openssl cli-Dienstprogramm nur? Haben Sie versucht, rabbitmqadmin utility?
- Haben Sie jemals Ihr Problem zu beheben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich das gleiche problem wie @user3653959 und @Sarah Messer, die Antwort führt mich zu der Lösung.
Ihre client-Zertifikat muss die
TLS Web Client Authentication
"X509v3 Extended Key Usage" - Attribut. Mir hatte nurTLS Web Server Authentication
durch einen Fehler in meinem client-generation-Skript.Überprüfen Sie Ihre client-Zertifikat nutzen zu können, können Sie das mit diesem Befehl:
Dann für die "X509v3-Erweiterungen:" Abschnitt und die "X509v3 Extended Key Usage:" Unterabschnitt.
Wenn Sie generieren Ihr client-Zertifikat am Beispiel
openssl.conf
- und client-und server-Befehlen, die in der offiziellen "RabbitMQ - TLS-Support" - Leitfaden, es sollte funktionieren out of the box.Der Schlüssel ist hier die
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
openssl-config-option inopenssl.conf
wie @Sarah Messer hervor. Dies ist die "TLS Web-Client Authentifizierung" - Fähigkeit. OpenSSLs_server
erfordert nicht diese Fähigkeit, und deshalb ist es standardmäßig funktioniert, aber nicht mit RabbitMQ.keyUsage = digitalSignature
ist genug als Haupt-nutzungsoptionen. Auch das "Common Name" (CN
) des client-Zertifikats ist nicht wichtig.Nur für Referenz
Meine Umgebung:
Die Fehler, die ich sah in meinem RabbitMQ log:
Die Fehler, die ich sah, über
openssl s_client
:extendedKeyUsage
war ich eigentlich Unterschreiben mein client-Zertifikat, ein server-Zertifikat. Achten Sie darauf, dass Ihre openssl-Befehl wird ausgeführt die richtigen Endungen Namen. (Es ist die-extensions XXXX
flag)Arbeitete ich mich durch ähnliche Probleme (mit RabbitMQ 2.7.1 /Erlang R14B04). Hier ist, was ich gefunden habe:
Den RabbitMQ plugins-Seite und mindestens eine andere Website empfehlen die Aktivierung des plugins rabbitmq_auth_mechanism_ssl. Wenn
rabbitmq-plugins
ist ein Ungültiger Befehl auf Ihrem system, auf dieser Seite beschreibt die aktivieren es auf Ubuntu. (Anscheinend ist der apt-get-Paket nicht ganz das erwartete Verhalten auf Debian-basierte Systeme.) Ihre Ausgabe (vonrabbitmqctl report
, vermute ich) sagt, dass Sie nicht habenrabbitmq_auth_mechanism_ssl
aktiviert.Für Ihre rabbitmq.Konfiguration, die Sie benötigen um sicherzustellen, dass "EXTERNE" ist in die Liste der auth_mechanisms. Das line-syntax ist
{auth_mechanisms, ['PLAIN', 'AMQPLAIN', 'EXTERNAL']}
und erscheint als Element in der Standard, "Kaninchen" Teil der Konfiguration.Sollten Sie auch sicherstellen, dass das Zertifikat Ihren Kunden stellt die entsprechenden eingestellten Werte für beide
keyUsage
undextendedKeyUsage
wie RabbitMQ ist mehr strenge über diese als s_server. Für debugging /testing-Zwecke, möchten Sie vielleicht zu sehr Freizügig mit diesen. Sie können legen Sie die Schlüsselverwendung in Ihrem openssl-config. Ein breit akzeptables openssl-config haben können Zeilen wie diesekeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign
extendedKeyUsage = 1.3.6.1.5.5.7.3.1, 1.3.6.1.5.5.7.3.2
(Ich denke, die .2 OID, "TLS Web-Client Authentifizierung" ist wichtig für die Verbindung zu RabbitMQ, aber ich habe es nicht getan sorgfältige tests.)
Produziert diese Zertifikate mit diesem block in der Nähe des Ende:
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement, Certificate Sign, CRL Sign
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
Es sollte mehr Ausgabe von s_client. Insbesondere interessiere ich mich für die Letzte Zeile, die sieht so etwas wie "Verify return code: 0 (ok)", Wenn Sie einen nicht-null - /- Fehler-Nachricht ist es, post-it und Drehpunkt aus, dass in Ihr sucht. (#19 ist überraschend, da es nicht wirklich ein Fehler.)
Wenn ich zu diesem Punkt gekommen, wenn ich habe versucht, eine einfache
pika.BlockingConnection
die handshake offenbar abgeschlossen ganz gut, aber Kaninchen entfernt EXTERNE aus der Liste angegeben inauth_mechanisms
in der config. Ich bestätigte, ich hatte rabbitmq_auth_mechanism_ssl aktiviert, aber das allein war nicht genug. (Ich entdeckte dies, indem bilden von Unterklassenpika.credentials.ExternalCredentials
und übergeben eine Instanz wie die "Anmeldeinformationen" Element in ConnectionParameters, indem einprint start
an der Spitze von der Unterklasse istresponse_for()
Methode.) Ich behoben, indem Sie die folgende Zeile, um dierabbit
Teil der config-Datei, auf der gleichen Ebene wiessl_listeners
undssl_cert_login_from
:{ssl_apps,[asn1,crypto,public_key,ssl]},
(Ich vermute, dass neuere Versionen von RabbitMQ aktivieren, die standardmäßig aktiviert, aber in meinem speziellen setup nicht.)
Wenn du das getan hast und Sie immer noch Schwierigkeiten haben, können Sie auch versuchen, ersetzen Sie "verify_peer" mit "verify_none" in Ihrem RabbitMQ config. Sie wollen wahrscheinlich nicht, dass in der Produktion, da öffnet Sie sich für jeden, der ein selbst-signiertes Zertifikat, aber es ist ein anderer Punkt. Auch eine Unterklasse der entsprechenden Dinge in pika und in print-Anweisungen, um mehr Einblick auf das, was Kaninchen versenden Sie und wie Ihre lokalen Kunden zu interpretieren.
Hier ist die Lösung die bei mir funktioniert:
Hinzufügen unten Chiffren in rabbitmq.config: