我需要連接到需要TLS 1.2在Python 2.7使用TLS1.2與FTPLIB。*
的FTPLIB FTP服務器有一個名爲FTP_TLS.ssl_version的對象,但我不能選擇ssl.PROTOCOL_TLSv1_2因爲它僅在Python 3.4中可用,並且可以在python 2.7.9上使用,而這個版本並未發佈。
我沒有辦法改變我的程序使用Python 3.4,所以我的選擇是什麼?
我需要連接到需要TLS 1.2在Python 2.7使用TLS1.2與FTPLIB。*
的FTPLIB FTP服務器有一個名爲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 TLS 1.2在客戶端版本13.10之前被禁用,所以它將最多使用TLS 1.1。使用Ubuntu 14.04,如果服務器支持它,它將使用TLS 1.2。
此更改的副作用是它不會將AUTH TLS
命令發送到FTP服務器,而是發送較早的AUTH SSL
命令,但大多數服務器可能不會在意。另一個副作用是,如果服務器不支持任何更好的功能,它還將允許TLS 1.0或SSL 3.0。如果你不想要這個,你不得不擺弄SSL上下文選項,但它看起來像只適用於python3。
感謝Ubuntu提示。這可能是問題!將升級到14.04並嘗試。 – W0bble 2014-11-04 10:43:23
不幸的是,這並沒有解決問題。無法連接到tls 1.2即使使用ubuntu 14.04 – W0bble 2014-11-12 15:34:12
@ W0bble:請參閱編輯如何解決硬編碼設置以僅使用TLS 1.0。 – 2014-11-15 16:06:03