我正在尝试连接到需要使用.pfx证书进行匿名登录的FTPS服务器。
我已经获得了如何通过gui应用程序SmartFTP访问它的说明,因为我知道我没有任何防火墙问题等等。但是,对于这个工作流程,通过python访问它将是理想。以下是我给出的设置:
Protocol: FTPS (Explicit)
Host: xxx.xxx.xxx.xxx
Port: 21
login type: Anonymous
Client Certificate: Enabled (providing a .pfx file)
Send FEAT: Send before and after login
我在使用.pfx证书的完整示例选择最适合这个的python模块时遇到了麻烦。目前我只使用以下代码尝试了标准FTP模块。有没有人有一个有效的例子?
from ftplib import FTP_TLS
ftps = FTP_TLS(host='xxx.xxx.xxx.xxx',
keyfile=r"/path/to.pfx"
)
ftps.login()
ftps.prot_p()
ftps.retrlines('LIST')
ftps.quit()
使用上面的代码我得到:
ValueError: certfile must be specified
客户端版本: Ubuntu == 14.04, Python == 3.6.2
认为我与下面的代码更接近,但得到一个新错误:
from ftplib import FTP_TLS
import tempfile
import OpenSSL.crypto
def pfx_to_pem(pfx_path, pfx_password):
""" Decrypts the .pfx file to be used with requests. """
with tempfile.NamedTemporaryFile(suffix='.pem') as t_pem:
f_pem = open(t_pem.name, 'wb')
pfx = open(pfx_path, 'rb').read()
p12 = OpenSSL.crypto.load_pkcs12(pfx, pfx_password)
f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()))
f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()))
ca = p12.get_ca_certificates()
if ca is not None:
for cert in ca:
f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))
f_pem.close()
yield t_pem.name
pfx = pfx_to_pem(r"/path/to.pfx", 'password')
ftps = FTP_TLS(host='xxx.xxx.xxx.xxx',
context=pfx
)
ftps.login()
ftps.prot_p()
# ftps.prot_c()
print(ftps.retrlines('LIST'))
ftps.quit()
错误: ftplib.error_perm:534服务器上的本地策略不允许TLS安全连接。
任何想法?
干杯
答案 0 :(得分:0)
听起来你尝试做SFTP。 FTP over SSL与SFTP不同。据我所知,标准库无法使用SFTP(与SSH相关)。
有关Python中的SFTP的更多信息,请参阅此内容:SFTP in Python? (platform independent)