【发布时间】:2014-11-04 09:24:04
【问题描述】:
我需要连接到需要 TLS 1.2 的 ftp 服务器
ftplib 有一个名为 FTP_TLS.ssl_version 的对象,但我不能选择 ssl.PROTOCOL_TLSv1_2,因为它仅在 Python 3.4 中可用,并且在本文未发布的 python 2.7.9 中可用。
我无法将我的程序更改为使用 Python 3.4,那么我有哪些选择?
【问题讨论】:
我需要连接到需要 TLS 1.2 的 ftp 服务器
ftplib 有一个名为 FTP_TLS.ssl_version 的对象,但我不能选择 ssl.PROTOCOL_TLSv1_2,因为它仅在 Python 3.4 中可用,并且在本文未发布的 python 2.7.9 中可用。
我无法将我的程序更改为使用 Python 3.4,那么我有哪些选择?
【问题讨论】:
可以假设默认值应该已经是连接到可能的最佳 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 13.10 之前,客户端禁用了 TLS 1.2,因此它最多使用 TLS 1.1。在 Ubuntu 14.04 中,如果服务器支持,它将使用 TLS 1.2。
此更改的副作用是它不会向 FTP 服务器发送 AUTH TLS 命令,而是向 FTP 服务器发送旧的 AUTH SSL 命令,但大多数服务器可能不会关心。另一个副作用是,如果服务器不支持更好的东西,它也将允许 TLS 1.0 或 SSL 3.0。如果您不希望这样做,则必须摆弄 SSL 上下文选项,但看起来这仅适用于 python3。
【讨论】: