Python - 在Docker客户端连接中的tlsv1警报协议版本错误

问题描述:

我使用Docker-pydockerpty以便exec命令使用Docker Python API。Python - 在Docker客户端连接中的tlsv1警报协议版本错误

这是很简单的代码:

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 
[email protected]:/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中,ssl.PROTOCOL_TLSv1_2不可用。您可以轻松地试图从Python控制台将其导入容器内部检查:

[email protected]:/# 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 

如果是这样的情况下,尝试在泊坞窗图像更新Python来>=2.7.9

另外请确保openssl版本> = 1.0.1

+0

两个答案是肯定的: '根@ SO1:/#蟒蛇 的Python 2.7.9(默认情况下,2016年6月29日,13时08分31秒) [GCC 4.9.2]上linux2上 键入“help “,”版权“,”信用“或”许可证“以获取更多信息。 >>>进口SSL >>> ssl.PROTOCOL_TLSv1_2 >>> ssl.PROTOCOL_TLSv1 >>>出口() 根@ SO1:/#OpenSSL的版本 的OpenSSL 1.0.1t 5月3日2016' – cybertextron

+0

我得到了同样的错误;( – KingPin