【问题标题】:Using TLS1.2 with ftplib in python 2.7.*在 python 2.7 中使用 TLS1.2 和 ftplib。*
【发布时间】: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,那么我有哪些选择?

【问题讨论】:

    标签: python ssl ftplib


    【解决方案1】:

    可以假设默认值应该已经是连接到可能的最佳 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。

    【讨论】:

    • 感谢 Ubuntu 的提示。这可能是问题所在!将升级到 14.04 并尝试一下。
    • 不幸的是,这并没有解决问题。即使使用 ubuntu 14.04 也无法连接到 tls 1.2
    • @W0bble:请参阅有关如何解决硬编码设置以仅使用 TLS 1.0 的编辑。
    猜你喜欢
    • 2012-01-31
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多