【发布时间】:2017-08-24 15:17:34
【问题描述】:
我正在尝试通过 FTP TLS 显式将文件传输到主机,但不知道如何处理证书。事务的 WinSCP 日志显示处理了 TLS 协商并验证了证书。但我的 Python 脚本无法做到这一点。我知道证书指纹和密码,但不知道如何实现。
我的脚本:
import ftplib
import ssl
def main():
ctx = ssl._create_stdlib_context(ssl.PROTOCOL_TLSv1_2)
ftps = ftplib.FTP_TLS(context=ctx)
try:
ftps.set_debuglevel(2)
print(ftps.connect(host))
ftps.auth()
print(ftps.login(username,password))
print("1")
ftps.prot_p()
print("2")
#ftps.cwd('/')
print("3")
print (ftps.retrlines('LIST'))
print("4")
ftps.storbinary("STOR test.csv", open('C:\\test.csv', 'rb'))
print("5")
except Exception as ex:
print("error: ")
print(ex)
ftps.close()
input('Hit <ENTER> to close...')
if __name__ == "__main__":
main()
这是我的输出,最后一行是 Python 错误:
*get* '220 Microsoft FTP Service\n'
*resp* '220 Microsoft FTP Service'
220 Microsoft FTP Service
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH command ok. Expecting TLS Negotiation.\n'
*resp* '234 AUTH command ok. Expecting TLS Negotiation.'
*cmd* 'USER xxx'
*put* 'USER xxx\r\n'
*get* '331 Password required\n'
*resp* '331 Password required'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User logged in.\n'
*resp* '230 User logged in.'
230 User logged in.
1
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 PBSZ command successful.\n'
*resp* '200 PBSZ command successful.'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 PROT command successful.\n'
*resp* '200 PROT command successful.'
2
3
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (x,x,x,x,4,4).\n'
*resp* '227 Entering Passive Mode (x,x,x,x,4,4).'
*cmd* 'LIST'
*put* 'LIST\r\n'
*get* '125 Data connection already open; Transfer starting.\n'
*resp* '125 Data connection already open; Transfer starting.'
*get* '226 Transfer complete.\n'
*resp* '226 Transfer complete.'
226 Transfer complete.
4
*cmd* 'TYPE I'
*put* 'TYPE I\r\n'
*get* '200 Type set to I.\n'
*resp* '200 Type set to I.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (x,x,x,x,4,3).\n'
*resp* '227 Entering Passive Mode (x,x,x,x,4,3).'
*cmd* 'STOR test.csv'
*put* 'STOR test.csv\r\n'
*get* '125 Data connection already open; Transfer starting.\n'
*resp* '125 Data connection already open; Transfer starting.'
error:
The read operation timed out
【问题讨论】:
-
请显示您收到的任何错误消息。
-
我编辑了我的帖子以包含错误日志。
-
根据更新,您声称根本没有 TLS 协商问题。如果有的话,您甚至无法在 AUTH TLS 之后发出 USER 命令。问题是在第二次数据传输期间数据连接超时,这可能是由中间的防火墙或服务器上的某些防病毒软件或类似原因引起的。但这不是 TLS 协商问题。
-
但是如果我记录一个 WinSCP 会话,我可以看到证书验证正在发生,而我的 Python 脚本似乎不会发生这种情况。不过,我会向我们的安全人员询问有关防火墙的问题。
-
不可能是防火墙问题,因为传输是通过 WinSCP 进行的。