我需要连接到需要TLS 1.2的ftp服务器
ftplib有一个名为FTP_TLS.ssl_version的对象,但是我不能选择ssl.PROTOCOL_TLSv1_2,因为它仅在Python 3.4中可用,并且将在python 2.7.9中提供,该帖子在本文中未发布。
我无法改变我的程序以使用Python 3.4所以我的选择是什么?
答案 0 :(得分:2)
可以假设默认值应该已经是最好的TLS版本连接。对TLS1.2的显式设置只是意味着客户端不会从服务器接受TLS1.2以下的任何内容。
不幸的是,ftplib决定将版本硬编码为TLSv1,从而减少与TLS 1.0的连接,即使OpenSSL支持更好的版本。由于旧的python版本无法显式请求TLS 1.1或TLS 1.2,因此您需要请求SSLv23,它会自动请求最佳版本:
import ssl
from ftplib import FTP_TLS
ftps = FTP_TLS('127.0.0.1')
## set protocol to SSLv23 to request best version
ftps.ssl_version = ssl.PROTOCOL_SSLv23;
ftps.login()
ftps.prot_p()
ftps.retrlines('LIST')
ftps.quit()
正常使用ftplib的唯一变化是将ssl_version
设置为ssl.PROTOCOL_SSLv23
,因此它会请求最佳版本。如果这将是TLS 1.2取决于服务器和客户端支持的版本。使用Ubuntu TLS 1.2在客户端禁用版本13.10,因此它最多将使用TLS 1.1。使用Ubuntu 14.04,如果服务器支持,它将使用TLS 1.2。
此更改的一个副作用是它不会向FTP服务器发送AUTH TLS
命令,而是发送旧的AUTH SSL
命令,但大多数服务器可能不关心。另一个副作用是,如果服务器不支持更好的任何东西,它还将允许TLS 1.0或SSL 3.0。如果您不想这样做,则必须使用SSL上下文选项,但看起来这只适用于python3。