FtpWebRequest 使用显式 TLS/SSL

Posted

技术标签:

【中文标题】FtpWebRequest 使用显式 TLS/SSL【英文标题】:FtpWebRequest working with Explicit TLS/SSL 【发布时间】:2010-09-03 00:14:56 【问题描述】:

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

看起来 .NET 到 3.5 的 FtpWebRequest 无论我是否启用了 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 下载文件或列表目录,但它会成功删除服务器中的文件并给出成功代码?我猜我的应用程序只能将控制/命令代码传递/发送到 ftp 服务器,但是 无法通过服务器的其他端口获取数据?

【问题讨论】:

【参考方案1】:

问题有很多,我们来一一解答:

为什么删除作品而上传、下载和列出却不行?

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)。这是不可能的,因为它是经过 NAT 的。

解决方案

切换到活动模式。

在主动模式下,FTP 服务器连接到 FTP 客户端进行数据传输。它将解决此问题,但对防火墙不友好。当传入的通信被阻止时它将不起作用(非常常见)。

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

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

这正是我们的Rebex FTP 在这种情况下所做的。它运行良好(可以关闭此行为)。我不知道 FtpWebRequest 是否可以使用类似的解决方法。

您可以download trial查看是否解决了您的问题。

【讨论】:

感谢 Martin Vobr 的解释,在我自己做了一些简单的阅读之后,我有点理解我的第一个问题。不过,非常感谢您的解释。 我下载了带有 .NET 4.0 的 VS2010 Express,它在默认设置下工作,无需选择被动或主动模式。在我们应用程序的其他部分,我仍在试用 VS Express。我仍然会将您的 cmets 转发给我的老板,以防他考虑为 Delphi 使用 3rd 方组件。再次感谢

以上是关于FtpWebRequest 使用显式 TLS/SSL的主要内容,如果未能解决你的问题,请参考以下文章

FtpWebRequest/FtpWebResponse 上的 OPTS 命令

使用 FtpWebRequest 附加到大型机上的文件时出现问题

FtpWebRequest打开随机端口而不是21

FtpWebRequest 测试环境连接失败

为啥 FtpWebRequest 恰好在长传输结束时抛出 WebException?

FtpWebRequest 下载文件