如何在建立到RabbitMQ的TLS连接时调试“pika.exceptions.AuthenticationError:EXTERNAL”错误?

时间:2016-04-17 08:21:31

标签: python ssl rabbitmq pika

我在Ubuntu 14.04上运行正常的RabbitMQ 3.6.1服务器。我尝试根据official documentation配置SSL侦听器。启动期间没有问题。

但是在尝试建立连接时,我在Python / pika方面遇到以下错误(下面的完整记录):

pika.exceptions.AuthenticationError: EXTERNAL

EXTERNAL在这里意味着什么?如何调试/获取错误的更多细节?

行动过程(测试我使用的是Vagrant框和本地连接):

  1. RabbitMQ在端口5671(每/var/log/rabbitmq/rabbit@rabbitmq-server.log)启动SSL侦听器:

    started SSL Listener on [::]:5671
    
  2. 我在客户端执行pika.BlockingConnection

  3. 在服务器端,我可以看到传入的连接:

    =INFO REPORT==== 17-Apr-2016::17:07:15 ===
    accepting AMQP connection <0.2788.0> (127.0.0.1:48404 -> 127.0.0.1:5671)
    
  4. 客户端失败:

    pika.exceptions.AuthenticationError: EXTERNAL
    
  5. 服务器超时:

    =ERROR REPORT==== 17-Apr-2016::17:07:25 ===
    closing AMQP connection <0.2788.0> (127.0.0.1:48404 -> 127.0.0.1:5671):
    {handshake_timeout,frame_header}
    
  6. 客户端的完整记录:

    >>> import pika, ssl
    >>> from pika.credentials import ExternalCredentials
    >>> ssl_options = ({"ca_certs": "/etc/rabbitmq/certs/testca/cacert.pem",
    ...                 "certfile": "/etc/rabbitmq/certs/client/cert.pem",
    ...                 "keyfile": "/etc/rabbitmq/certs/client/key.pem",
    ...                 "cert_reqs": ssl.CERT_REQUIRED,
    ...                 "server_side": False})
    >>> host = "localhost"
    >>> connection = pika.BlockingConnection(
    ...                  pika.ConnectionParameters(
    ...                      host, 5671, credentials=ExternalCredentials(),
    ...                      ssl=True, ssl_options=ssl_options))
    Traceback (most recent call last):
      File "<stdin>", line 4, in <module>
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 339, in __init__
        self._process_io_for_connection_setup()
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 374, in _process_io_for_connection_setup
        self._open_error_result.is_ready)
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 410, in _flush_output
        self._impl.ioloop.poll()
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/select_connection.py", line 602, in poll
        self._process_fd_events(fd_event_map, write_only)
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/select_connection.py", line 443, in _process_fd_events
        handler(fileno, events, write_only=write_only)
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 364, in _handle_events
        self._handle_read()
      File "/usr/local/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 415, in _handle_read
        self._on_data_available(data)
      File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1347, in _on_data_available
        self._process_frame(frame_value)
      File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1414, in _process_frame
        if self._process_callbacks(frame_value):
      File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1384, in _process_callbacks
        frame_value)  # Args
      File "/usr/local/lib/python2.7/dist-packages/pika/callback.py", line 60, in wrapper
        return function(*tuple(args), **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/pika/callback.py", line 92, in wrapper
        return function(*args, **kwargs)
      File "/usr/local/lib/python2.7/dist-packages/pika/callback.py", line 236, in process
        callback(*args, **keywords)
      File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1298, in _on_connection_start
        self._send_connection_start_ok(*self._get_credentials(method_frame))
      File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1077, in _get_credentials
        raise exceptions.AuthenticationError(self.params.credentials.TYPE)
    pika.exceptions.AuthenticationError: EXTERNAL
    >>>
    

1 个答案:

答案 0 :(得分:1)

问题中的Python / pika代码是正确的。

错误:

  

pika.exceptions.AuthenticationError:EXTERNAL

在RabbitMQ服务器端未启用客户端证书授权时,会报告

。错误中的单词EXTERNAL将身份验证机制称为described here

启用:

rabbitmq-plugins enable rabbitmq_auth_mechanism_ssl