Python 使用外部凭据验证rabbitmq

Python 使用外部凭据验证rabbitmq,python,ssl,rabbitmq,tls1.2,pika,Python,Ssl,Rabbitmq,Tls1.2,Pika,我有一个rabbitmq服务器,使用pika库和Python生成/使用消息。出于开发目的,我只是使用 credentials=pika.PlainCredentials(,) 我想将其更改为使用pika.ExternalCredentials或TLS 我已将rabbitmq服务器设置为侦听端口5671上的TLS,并已正确配置它。我可以从本地主机与rabbitmq通信,但当我尝试从本地主机外部与它通信时,它就不喜欢这样了。我感觉我的“凭证”基于rabbitmq中的“来宾”用户 rabbitmq.c

我有一个rabbitmq服务器,使用pika库和Python生成/使用消息。出于开发目的,我只是使用

credentials=pika.PlainCredentials(,)

我想将其更改为使用pika.ExternalCredentials或TLS

我已将rabbitmq服务器设置为侦听端口5671上的TLS,并已正确配置它。我可以从本地主机与rabbitmq通信,但当我尝试从本地主机外部与它通信时,它就不喜欢这样了。我感觉我的“凭证”基于rabbitmq中的“来宾”用户

rabbitmq.config 我可以确认这是有效的,因为我在rabbitmq的日志中看到:

2019-08-21 15:34:47.663 [info] <0.442.0> started TLS (SSL) listener on [::]:5671
当我在本地运行脚本时
(,b'Hello,world!')
当我从另一个实例运行脚本时
回溯(最近一次呼叫最后一次):
文件“pbbarcode.py”,第200行,在
main()
文件“pbbarcode.py”,第187行,主
连接=pika.BlockingConnection(参数)
文件“/usr/local/lib/python3.7/site packages/pika/adapters/blocking_connection.py”,第359行,在__
self.\u impl=self.\u创建连接(参数,\u impl\u类)
文件“/usr/local/lib/python3.7/site packages/pika/adapters/blocking_connection.py”,第450行,在创建连接中
提升自我。\收获\上次连接\工作流\错误(错误)
pika.exceptions.amqConnectionError
当我在本地运行脚本并删除来宾用户时
回溯(最近一次呼叫最后一次):
文件“test_mq.py”,第12行,在
使用pika.BlockingConnection(连接参数)作为连接:
文件“/home/daudn/.local/lib/python3.7/site packages/pika/adapters/blocking_connection.py”,第359行,在u init中__
self.\u impl=self.\u创建连接(参数,\u impl\u类)
文件“/home/daudn/.local/lib/python3.7/site packages/pika/adapters/blocking\u connection.py”,第450行,在创建连接中
提升自我。\收获\上次连接\工作流\错误(错误)
pika.exceptions.ProbableAuthenticationError:ConnectionClosedByBroker:(403)“拒绝访问-使用身份验证机制拒绝登录。有关详细信息,请参阅代理日志文件
似乎SSL是用用户“guest”配置的,rabbitmq不允许连接到本地主机之外的guest。如何对其他用户使用SSL? 当我删除来宾用户时,rabbitmq日志会这样说:

2019-08-22 10:14:40.054 [info] <0.735.0> accepting AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671)
2019-08-22 10:14:40.063 [error] <0.735.0> Error on AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671, state: starting):
PLAIN login refused: user 'guest' - invalid credentials
2019-08-22 10:14:40.063 [warning] <0.735.0> closing AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671):
client unexpectedly closed TCP connection
2019-08-22 10:15:12.613 [info] <0.743.0> Creating user 'guest'
2019-08-22 10:15:28.370 [info] <0.750.0> Setting user tags for user 'guest' to [administrator]
2019-08-22 10:15:51.352 [info] <0.768.0> Setting permissions for 'guest' in '/' to '.*', '.*', '.*'
2019-08-22 10:15:54.237 [info] <0.774.0> accepting AMQP connection <0.774.0> (127.0.0.1:59202 -> 127.0.0.1:5671)
2019-08-22 10:15:54.243 [info] <0.774.0> connection <0.774.0> (127.0.0.1:59202 -> 127.0.0.1:5671): user 'guest' authenticated and granted access to vhost '/'
2019-08-22 10:14:40.054[信息]接受AMQP连接(127.0.0.1:59192->127.0.0.1:5671)
2019-08-22 10:14:40.063[错误]AMQP连接错误(127.0.0.1:59192->127.0.0.1:5671,状态:启动):
普通登录被拒绝:用户“来宾”-凭据无效
2019-08-22 10:14:40.063[警告]关闭AMQP连接(127.0.0.1:59192->127.0.0.1:5671):
客户端意外地关闭了TCP连接
2019-08-22 10:15:12.613[信息]创建用户“来宾”
2019-08-22 10:15:28.370[信息]将用户“来宾”的用户标签设置为[管理员]
2019-08-22 10:15:51.352[信息]在“/”至“.*”、“.*”、“.*”中设置“来宾”的权限
2019-08-22 10:15:54.237[信息]接受AMQP连接(127.0.0.1:59202->127.0.0.1:5671)
2019-08-22 10:15:54.243[信息]连接(127.0.0.1:59202->127.0.0.1:5671):用户“来宾”通过身份验证并被授予访问vhost'/'的权限
这显然也意味着SSL仍在使用用户名和密码连接到rabbitmq?救命啊

参考资料:


您必须启用rabbitmq身份验证机制ssl插件,我认为您缺少这一部分

要启用插件,请执行以下操作(显示Windows安装的示例)


我将把这个留在这里以备将来参考

ssl\u options=pika.SSLOptions(上下文,“rabbitmq节点名”)
params=pika.ConnectionParameters(host=“rabbitmq节点名”,port=5671,ssl\u options=ssl\u options,credentials=ExternalCredentials())

令人困惑的是,我认为在执行SSLOptions(context,“rabbitmq node name”)时,我认为我已经在这里提供了主机,而不必在ConnectionParameters()的args中再次提供它。但事实证明这是错误的,如果没有提供主机,则默认为localhost。这就是脚本在本地运行而不是在本地网络之外运行的原因。

我编辑了我的问题,问题是SSL配置了默认的“来宾”用户,因此,我无法从本地环境外部访问它。当从远程系统登录的用户来宾被拒绝访问时,您可以共享rabbitmq日志吗?日志中没有显示任何内容,因为它直接抛出
pika.exceptions.AMQPConnectionError
。。。。如果您查看我的代码“test_rabbitmq.py”,我没有指定用户/密码,因为我试图通过SSL访问它?当在本地主机上运行类似的代码时,日志显示:
2019-08-22 10:14:40.063[error]AMQP连接错误(127.0.0.1:59192->127.0.0.1:5671,状态:starting):普通登录被拒绝:用户“guest”-无效凭据。。你能给外部一个像这样的优先权吗{auth_机制,['External','PLAIN','AMQPLAIN'},
import pika
import ssl
from pika.credentials import ExternalCredentials

context = ssl.create_default_context(cafile="~/tls-gen/basic/result/ca_certificate.pem")
context.load_cert_chain("~/tls-gen/basic/result/client_certificate.pem",
                            "~/tls-gen/basic/result/client_key.pem")
ssl_options = pika.SSLOptions(context, "10.154.0.27")
params = pika.ConnectionParameters(port=5671,ssl_options=ssl_options, credentials = ExternalCredentials())
connection = pika.BlockingConnection(params)
channel = connection.channel()
(<Basic.GetOk(['delivery_tag=1', 'exchange=', 'message_count=0', 'redelivered=False', 'routing_key=foobar'])>, <BasicProperties>, b'Hello, world!')
Traceback (most recent call last):
  File "pbbarcode.py", line 200, in <module>
    main()
  File "pbbarcode.py", line 187, in main
    connection = pika.BlockingConnection(params)
  File "/usr/local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 359, in __init__
    self._impl = self._create_connection(parameters, _impl_class)
  File "/usr/local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 450, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.AMQPConnectionError
Traceback (most recent call last):
  File "test_mq.py", line 12, in <module>
    with pika.BlockingConnection(conn_params) as conn:
  File "/home/daudn/.local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 359, in __init__
    self._impl = self._create_connection(parameters, _impl_class)
  File "/home/daudn/.local/lib/python3.7/site-packages/pika/adapters/blocking_connection.py", line 450, in _create_connection
    raise self._reap_last_connection_workflow_error(error)
pika.exceptions.ProbableAuthenticationError: ConnectionClosedByBroker: (403) 'ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.'
2019-08-22 10:14:40.054 [info] <0.735.0> accepting AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671)
2019-08-22 10:14:40.063 [error] <0.735.0> Error on AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671, state: starting):
PLAIN login refused: user 'guest' - invalid credentials
2019-08-22 10:14:40.063 [warning] <0.735.0> closing AMQP connection <0.735.0> (127.0.0.1:59192 -> 127.0.0.1:5671):
client unexpectedly closed TCP connection
2019-08-22 10:15:12.613 [info] <0.743.0> Creating user 'guest'
2019-08-22 10:15:28.370 [info] <0.750.0> Setting user tags for user 'guest' to [administrator]
2019-08-22 10:15:51.352 [info] <0.768.0> Setting permissions for 'guest' in '/' to '.*', '.*', '.*'
2019-08-22 10:15:54.237 [info] <0.774.0> accepting AMQP connection <0.774.0> (127.0.0.1:59202 -> 127.0.0.1:5671)
2019-08-22 10:15:54.243 [info] <0.774.0> connection <0.774.0> (127.0.0.1:59202 -> 127.0.0.1:5671): user 'guest' authenticated and granted access to vhost '/'
rabbitmq-plugins.bat enable rabbitmq_auth_mechanism_ssl