代码之家  ›  专栏  ›  技术社区  ›  Paul L

ftpWebRequest使用显式tls/ssl

  •  3
  • Paul L  · 技术社区  · 14 年前

    我正在尝试通过显式TLS/SSL传输文件。

    看起来.NET中的ftpWebRequest在3.5之前不会工作,不管我是否启用了usepassive。如果它被禁用,我认为有防火墙/路由器配置来处理(对于活动模式),一旦应用程序部署到客户机上,我就没有任何控制权,很可能不会立即工作。

    但是如果我禁用了userpassive,它将抛出一个“服务器响应pasv命令返回的地址与ftp连接的地址不同”并根据这个线程:

    The server returned an address in response to the PASV command that is different than the address to which the FTP connection was made

    https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97409&wa=wsignin1.0 还是不行。

    顺便问一下,如果我确切地知道公共IP和内部IP,有没有一种方法可以让我接受新的内部IP地址,那么它至少会工作?第一个链接使它起作用,但我不明白他为什么以及如何做到这一点?什么是MyProxyServerIP?我需要代理服务器吗?

    奇怪的是,即使我的应用程序不能通过ftp下载文件或listdirectory,但它会成功删除服务器中的文件并给出成功代码?我想我的应用程序只能向ftp服务器传递/发送控制/命令代码,但是 从服务器通过其他端口获取数据有困难吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Martin Vobr    14 年前

    有多个问题,我们试着逐一解决:

    为什么删除作品,但上传、下载和列表没有?

    FTP协议使用两个单独的连接。第一(称为 控制连接 )用于响应简单的命令-如登录、删除、生成目录等。通常在端口21上运行。

    当ftp客户端请求数据传输操作时,另一个连接(调用 数据连接 )已建立。在主动模式下,ftp服务器连接到客户机,而在被动模式下,客户机连接到服务器。如果此连接被防火墙阻止,数据传输操作将失败。数据传输操作包括上传、下载以及 目录列表 . 这就是为什么删除有效而列表无效的原因。

    服务器响应pasv命令返回了一个不同于ftp连接地址的地址。

    在被动模式下,ftp会话如下:

    client: PASV
    (i would like to transfer files. Tell me which port and ip address should I use)
    
    server: 227 Entering Passive Mode (172,16,3,4,204,173)
    (ok, use port 52397 on IP address 172.16.3.4.)
    
    client: connects to this IP address/port and starts data transfer.
    

    它可能会在具有多个IP地址的FTP服务器上造成问题。我遇到过一些具有公共IP地址(比如1.2.3.4)和私有IP地址(192.168.2.3)的FTP服务器。

    当FTP客户机连接到公共IP地址(1.2.3.4)并请求数据传输操作服务器时,服务器指示他使用专用IP地址(192.168.2.3)。这是不可能的,因为它是被命名的。

    解决方案

    切换到激活模式。

    在活动模式下,ftp服务器连接到ftp客户机进行数据传输。它可以解决这个问题,但不支持防火墙。当输入的逗号被阻塞(非常常见)时,它将不起作用。

    忽略IP地址作为对pasv命令的响应发送

    如果公用FTP服务器IP地址是公用的,并且作为对pasv命令的响应返回的IP地址来自专用范围(例如10)。 ,192.168。 )在这种情况下,ftp客户机应该使用公共IP地址。

    这正是我们的 Rebex FTP 在这种情况下做。它工作得很好(可以关闭此行为)。我不知道FTPWebrequest是否可以进行类似的解决方案。

    你可以 download trial 检查它是否解决了你的问题。