【问题标题】:Trying to connect to FTP site but getting wrong SSL version number error?尝试连接到 FTP 站点但收到错误的 SSL 版本号错误?
【发布时间】:2017-04-07 13:30:01
【问题描述】:

我正在使用 Python 2.7。 我最近使用端口 990 成功建立了与我的 ftp 站点的连接。但是,我需要切换到端口 22 的站点有一个未更新。所以我所做的只是将端口号从 990 更改为 22。但是,在我是不是我得到了错误:

[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:661)

我已尝试检查其他类似的帖子,这些帖子建议将 https:// 附加到该站点。我使用的是 FTP 而不是 url,所以这对我来说是不可能的。我也尝试将 ssl_version 更改为 ssl.PROTOCOL_SSLv23 但收到以下错误:

[SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:661)

这是我提供的完整代码。有谁知道问题是什么?感谢您的帮助。

from ftplib import FTP_TLS
import socket
import ssl

class tyFTP(FTP_TLS):
    def __init__(self, host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=60):
        FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, context, timeout)
    def connect(self, host='', port=0, timeout=-999):
        if host != '':
            self.host = host
        if port > 0:
            self.port = port
        if timeout != -999:
            self.timeout = timeout

        try: 
            self.sock = socket.create_connection((self.host, self.port), self.timeout)
            self.af = self.sock.family
            self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile, ssl_version=ssl.PROTOCOL_TLSv1)
            # self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile, ssl_version=ssl.PROTOCOL_SSLv23)
            self.file = self.sock.makefile('rb')
            self.welcome = self.getresp()
        except Exception as e:
            print e

    return self.welcome

FTP_SITE = "sftp.MySite.com"

UPLOAD = {
    "USERNAME": "username",
    "PASSWORD": "password"
}

DOWNLOAD = {
    "USERNAME": "username",
    "PASSWORD": "password"
}

server = tyFTP()
# changed from 990. 990 works with no issues.
server.connect(host=FTP_SITE, port=22)

【问题讨论】:

  • 他们是否有可能恢复到普通的旧 FTP 而不是 SFTP。您是否尝试过不使用 SSL 访问服务器?
  • 他们向我保证他们正在使用 SSL 迁移到 SFTP。
  • SFTP 不使用 SSL,而是使用 SSH。

标签: python sockets ssl ftp


【解决方案1】:

990 是隐式 FTPS 的端口,而 22 是 SSH 的端口,因此也是 SFTP。我的猜测是,他们不仅切换了端口,而且实际上从 FTPS(基于 SSL 的 FTP)切换到了 SFTP(基于 SSH 的文件传输)。这也暗示了您使用的主机名:sftp.MySite.com

FTPS 和 SFTP 是完全不同的协议,您不能使用实现 FTPS 的代码连接到 SFTP 服务器。有关在 Python 中支持 SFTP 的库,请参阅google search

【讨论】:

  • 你说的很有道理,我现在就试试。只是好奇,因为我在使用端口 990 时对同一站点 sftp.MySite.com 和代码没有任何问题。所以代码是为 SFTP 编写的,但仍然可以在端口 990 上运行。
  • @Alex:FTP_TLS 是通过 SSL/TLS 实现 FTP 的库,即 FTPS 协议(端口 990)而不是 SFTP 协议(​​端口 22)。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2017-10-08
  • 1970-01-01
  • 2022-12-12
  • 2013-06-02
相关资源
最近更新 更多