You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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并验证服务端证书有效性:

  1. 创建SSL上下文并指定TLS协议版本
  2. 设置证书验证模式为强制验证服务端证书
  3. 加载用于验证服务端证书的CA根证书
  4. 创建包含SSL选项的连接参数,建立加密连接

当服务端要求客户端证书认证时,需额外加载客户端自身的证书和私钥文件,即添加load_cert_chain调用。

内容的提问来源于stack exchange,提问作者develop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:50:35