RabbitMQ TLS连接报错ConnectionResetError求助
RabbitMQ TLS连接报错
ConnectionResetError排查方案 问题描述
RabbitMQ新手配置TLS加密连接后,客户端无法连接服务端,报错:ConnectionResetError: [Errno 104] Connection reset by peer
客户端Python代码
import pika, sys, os, ssl def main(): context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) context.verify_mode = ssl.CERT_REQUIRED context.load_verify_locations("/home/dev/Desktop/files_from_ssh/ca_certificate.pem") credentials = pika.PlainCredentials(username='xxx', password='xxxx') conn_params = pika.ConnectionParameters(host="***",port=5672,heartbeat=60,ssl_options=pika.SSLOptions(context), virtual_host="test_environment",credentials=credentials) connection = pika.BlockingConnection(conn_params) channel = connection.channel() channel.queue_declare(queue='ssl_test') def callback(ch, method, properties, body): print(" [x] Received %r" % body) channel.basic_consume(queue='ssl_test', on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming() if __name__ == '__main__': try: main() except KeyboardInterrupt: print("Interrupted") try: sys.exit(0) except SystemExit: pass
服务端TLS启用状态
Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication Interface: [::], port: 5672, protocol: amqp/ssl, purpose: AMQP 0-9-1 and AMQP 1.0 over TLS Interface: [::], port: 15672, protocol: http, purpose: HTTP API
RabbitMQ配置(rabbitmq.conf)
listeners.ssl.default = 5672 ssl_options.cacertfile = /home/dev/testca/ca_certificate.pem ssl_options.certfile = /home/dev/server/server_certificate.pem ssl_options.keyfile = /home/dev/server/private_key.pem ssl_options.verify = verify_peer ssl_options.fail_if_no_peer_cert = true listeners.tcp = none
核心排查点与修复方案
- 客户端证书缺失(关键问题):服务端配置了
ssl_options.verify = verify_peer和ssl_options.fail_if_no_peer_cert = true,强制要求客户端提供合法证书。当前客户端仅加载了CA证书,未配置客户端自身的证书和私钥,需添加以下代码到上下文配置部分:context.load_cert_chain(certfile="/path/to/client_certificate.pem", keyfile="/path/to/client_private_key.pem") - CA证书一致性校验:确保客户端加载的
ca_certificate.pem与服务端ssl_options.cacertfile指定的文件完全一致,可通过md5sum命令校验文件哈希值。 - TLS版本兼容性:确认服务端允许TLSv1.2连接,可在RabbitMQ配置中添加
ssl_options.versions = tlsv1.2明确指定支持的版本。 - 网络连通性检查:验证客户端与服务端5672端口无防火墙/安全组拦截,可使用
telnet <server-ip> 5672或nc -zv <server-ip> 5672测试。 - 虚拟主机权限验证:确保用户
xxx在test_environment虚拟主机拥有configure、write、read权限,可通过RabbitMQ管理后台或rabbitmqctl list_user_permissions xxx命令检查。
参考文档翻译(原文档为TLS服务端认证示例)
该示例演示了如何配置Pika客户端通过TLS连接RabbitMQ并验证服务端证书有效性:
- 创建SSL上下文并指定TLS协议版本
- 设置证书验证模式为强制验证服务端证书
- 加载用于验证服务端证书的CA根证书
- 创建包含SSL选项的连接参数,建立加密连接
当服务端要求客户端证书认证时,需额外加载客户端自身的证书和私钥文件,即添加load_cert_chain调用。
内容的提问来源于stack exchange,提问作者develop
相关产品推荐
相关产品推荐

