【问题标题】:Python - tlsv1 alert protocol version error in Docker client connectionPython - Docker客户端连接中的tlsv1警报协议版本错误
【发布时间】:2017-02-04 04:58:11
【问题描述】:

我正在使用Docker-pydockerpty 以便使用Docker Python API 执行exec 命令。

代码很简单:

container = client.inspect_container(containerId)[0]
dockerpty.exec_command(client, container, command)

当我想执行诸如echo 'hello' 之类的命令时,它可以正常工作。但是,像/bin/bash 这样的命令,即使我能够获取终端,也会导致以下错误:

ubuntu:test$ python main.py exec [containerid] /bin/bash
root@so1:/opt/apache# Traceback (most recent call last):
  File "__main__.py", line 216, in <module>
    main()
  File "__main__.py", line 201, in main
    ec.execute()
    dockerpty.exec_command(client, container, command)
  File "/usr/local/lib/python2.7/site-packages/dockerpty/__init__.py", line 44, in exec_command
    PseudoTerminal(client, operation).start()
  File "/usr/local/lib/python2.7/site-packages/dockerpty/pty.py", line 334, in start
    self._hijack_tty(pumps)
  File "/usr/local/lib/python2.7/site-packages/dockerpty/pty.py", line 373, in _hijack_tty
    pump.flush()
  File "/usr/local/lib/python2.7/site-packages/dockerpty/io.py", line 367, in flush
    read = self.from_stream.read(n)
  File "/usr/local/lib/python2.7/site-packages/dockerpty/io.py", line 120, in read
    return self.fd.recv(n)
  File "/usr/local/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 194, in recv
    data = self.connection.recv(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1302, in recv
    self._raise_ssl_error(self._ssl, result)
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 1172, in _raise_ssl_error
    _raise_current_error()
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 48, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert protocol version')]

当我创建客户端时,我指定tls_config 使用tlsv1.2

    tls_config = docker.tls.TLSConfig(
        client_cert=(cert, key),
        ssl_version=ssl.PROTOCOL_TLSv1_2,
    )
    client = docker.Client(base_url=url, timeout=timeout,
                           tls=tls_config, user_agent=user_agent)

为什么我会收到这个'tlsv1 alert protocol version' 错误,我该如何解决这个问题?

【问题讨论】:

    标签: python bash ssl docker


    【解决方案1】:

    在某些较旧版本的 Python 中,ssl.PROTOCOL_TLSv1_2 不可用。您可以通过尝试从容器内的 Python 控制台导入它来轻松检查:

    root@57c6d8b01861:/# python
    Python 2.7.8 (default, Nov 26 2014, 22:28:51) 
    >>> import ssl
    >>> ssl.PROTOCOL_TLSv1_2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2'
    >>> ssl.PROTOCOL_TLSv1
    3
    

    如果是这种情况,请尝试将 Docker 映像中的 Python 更新为 &gt;=2.7.9

    还要确保openssl 版本是>=1.0.1

    【讨论】:

    • 两者的答案都是肯定的:root@so1:/#python Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. &gt;&gt;&gt; import ssl &gt;&gt;&gt; ssl.PROTOCOL_TLSv1_2 5 &gt;&gt;&gt; ssl.PROTOCOL_TLSv1 3 &gt;&gt;&gt; exit() root@so1:/# openssl version OpenSSL 1.0.1t 3 May 2016
    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多