我正在尝试使用RabbitMQ的SSL证书,但我不断与代理获得握手错误.
在单独的终端窗口中使用openssl的's_client'和's_server'命令并使用端口8443时,我生成的证书工作正常,详见SSL故障排除指南(http://www.rabbitmq.com/troubleshooting-ssl. HTML).
当我尝试使用相同的openssl's_client'命令连接到RabbitMQ SSL端口5671时,会出现问题:
运行这个:
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
Run Code Online (Sandbox Code Playgroud)
产生这个:
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:
---
Run Code Online (Sandbox Code Playgroud)
SSL侦听器启动正常,如RabbitMQ日志中所示:
=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
Run Code Online (Sandbox Code Playgroud)
尝试使用"s_client"连接到端口5671时,会出现错误:
=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)
Run Code Online (Sandbox Code Playgroud)
RabbitMQ配置文件:
[
{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}]}
]}
].
Run Code Online (Sandbox Code Playgroud)
RabbitMQ信息:
[{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.
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
提前致谢.
更新:
尝试连接rabbitmqadmin实用程序时出现以下错误.
日志文件:
=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)
Run Code Online (Sandbox Code Playgroud)
rabbitmqadmin命令产生以下内容:
*** Could not connect: [Errno 1] _ssl.c:492: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
Run Code Online (Sandbox Code Playgroud)
我有同样的问题@ user3653959和@Sarah梅塞尔的回答引导我找到解决方案.
您的客户端证书必须在TLS Web Client Authentication"采用X509v3扩展密钥使用"属性.我只是TLS Web Server Authentication由于我的客户端生成脚本中的错误.
要检查客户端证书的功能,可以使用以下命令:
openssl x509 -noout -text -in client-certificate.pem
Run Code Online (Sandbox Code Playgroud)
然后查找" X509v3扩展: "部分和" X509v3扩展密钥用法: "小节.
如果使用openssl.conf官方"RabbitMQ-TLS支持"指南中提供的示例和客户端和服务器命令生成客户端证书,则它应该开箱即用.
这里的关键是@Sarah Messer指出的extendedKeyUsage = 1.3.6.1.5.5.7.3.2openssl配置选项openssl.conf.这是"TLS Web客户端身份验证"功能.OpenSSL s_server不需要此功能,这就是它默认使用它的原因,但不适用于RabbitMQ.keyUsage = digitalSignature足以作为主要使用选项.此外,CN客户端证书的"公共名称"()并不重要.
我的环境:
我在RabbitMQ日志中看到的错误:
=ERROR REPORT==== 21-Jun-2016::13:28:21 ===
SSL: certify: ssl_handshake.erl:1492:Fatal error: handshake failure
Run Code Online (Sandbox Code Playgroud)
我看到的错误openssl s_client:
140735165813584:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40
140735165813584:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
Run Code Online (Sandbox Code Playgroud)
我也遇到了类似的麻烦(使用 RabbitMQ 2.7.1 / Erlang R14B04)。这是我发现的:
RabbitMQ插件页面和至少一个其他站点建议启用插件rabbitmq_auth_mechanism_ssl。如果rabbitmq-plugins是您系统上的无效命令,本页介绍如何在 Ubuntu 上启用它。(显然 apt-get 软件包在基于 Debian 的系统上没有完全符合预期的行为。)您的输出(rabbitmqctl report我认为来自 )表明您没有rabbitmq_auth_mechanism_ssl启用。
对于您的rabbitmq.config,您需要确保“EXTERNAL”被列为auth_mechanisms之一。该行的语法是{auth_mechanisms, ['PLAIN', 'AMQPLAIN', 'EXTERNAL']}并且显示为配置的默认“兔子”部分中的一项。
您还应该确保您的客户端提供的证书为 和 都设置了适当的值keyUsage,extendedKeyUsage因为 RabbitMQ 对这些值比 s_server 更严格。出于调试/测试的目的,您可能希望对这些非常宽容。您可以在openssl config中设置 keyUsage 。广泛接受的 openssl 配置可能有这样的行
keyUsage = 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
(我认为 .2 OID,“TLS Web 客户端身份验证”对于连接到 RabbitMQ 很重要,但我没有做过仔细的测试。)
这将生成该块接近末尾的证书:
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
s_client 应该有更多输出。特别是,我对最后一行感兴趣,它应该类似于“验证返回代码:0(确定)”如果您有非零/错误消息,请将其发布并在搜索中将其关闭。(#19 出人意料地常见,因为它并不是一个真正的错误。)
当我到达这一点时,当我尝试制作一个简单的 时pika.BlockingConnection,握手显然完成得很好,但是 Rabbit 从auth_mechanisms配置中指定的列表中删除了 EXTERNAL 。我确认我启用了rabbitmq_auth_mechanism_ssl,但这本身还不够。(我通过子类化pika.credentials.ExternalCredentials并传递一个实例作为 ConnectionParameters 中的“凭据”项发现了这一点,并print start在子类方法的顶部response_for()添加了 。)我通过将以下行添加到rabbit同一级别的配置文件部分来修复该问题作为ssl_listeners和ssl_cert_login_from:
{ssl_apps,[asn1,crypto,public_key,ssl]},
(我怀疑较新版本的 RabbitMQ 默认情况下会打开该功能,但我的特定设置并未打开。)
如果您已完成所有这些操作但仍然遇到问题,您也可以尝试在 RabbitMQ 配置中将“verify_peer”替换为“verify_none”。您可能不希望在生产中使用它,因为它向任何拥有自签名证书的人开放,但这是另一个数据点。此外,对 pika 中的相关内容进行子类化并添加打印语句,以更深入地了解 Rabbit 向您发送的内容以及本地客户如何解释它。
| 归档时间: |
|
| 查看次数: |
14632 次 |
| 最近记录: |