可以通过Filezilla明确ftps,但不能从代码

这是最初发布到StackOverflow,但由于代码的作品,这很可能是一个networking/防火墙的问题,我想我会问这里。

正如标题所述,我可以通过FileZilla Client从我的服务器连接到另一台机器,但是我不能通过代码(.Net – FTPWebRequest)

我知道代码是好的,因为它从另一台机器上运行。 我遇到的特定机器是在NAT后面,但是SA已经打开了所有与我们正在谈话的主机的通信的端口。

任何build议 – 我错过了明显的东西?

我尝试连接的例外是:

"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond." 

而且,我们试图连接的机器的日志显示:

 7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> Connected, sending welcome message... 7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220-FileZilla Server version 0.9.32 beta 7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com 7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> AUTH TLS 7/26/2010 12:40:24 PM - (not logged in) (xx.xx.xxx.xxx)> 234 Using authentication type TLS 7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> 421 Login time exceeded. Closing control connection. 7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> disconnected. 

编辑:我使用代码和filezilla连接的被动模式。 根据要求,以下是代码(在另一台机器上)的成功ftps连接(LIST)的日志:

7/26/2010 12:45:03 PM – (还未login)(xx.xx.xxx.xxx)>已连接,正在发送欢迎信息…

7/26/2010 12:45:03 PM – (没有login)(xx.xx.xxx.xxx)> 220-FileZilla服务器版本0.9.32 beta

7/26/2010 12:45:03 PM – (没有login)(xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com

7/26/2010 12:45:03 PM – (还未login)(xx.xx.xxx.xxx)> AUTH TLS

7/26/2010 12:45:04 PM – (not logged in)(xx.xx.xxx.xxx)> 234使用authenticationtypesTLS

2010/7/26 12:45:04 – (没有login)(xx.xx.xxx.xxx)>build立了SSL连接

7/26/2010 12:45:04 PM – (还未login)(xx.xx.xxx.xxx)> PBSZ 0

7/26/2010 12:45:04 PM – (还未login)(xx.xx.xxx.xxx)> 200 PBSZ = 0

7/26/2010 12:45:05 PM – (还未login)(xx.xx.xxx.xxx)> PROT P

7/26/2010 12:45:05 PM – (not logged in)(xx.xx.xxx.xxx)> 200保护级别设置为P

2010/7/26 12:45:05 – (没有login)(xx.xx.xxx.xxx)> USER用户名

7/26/2010 12:45:05 PM – (没有login)(xx.xx.xxx.xxx)> 331用户名所需的密码

7/26/2010 12:45:05 PM – (没有登入)(xx.xx.xxx.xxx)> PASS xxxxxxxxxx

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 230login

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> OPTS utf8 on

2010/7/26 12:45:05 – 用户名(xx.xx.xxx.xxx)>启用了200个UTF8模式

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> PWD

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 257“/”是当前目录。

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> CWD /

7/26/2010 12:45:05 PM – 用户名(xx.xx.xxx.xxx)> 250 CWD成功。 “/”是当前目录。

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> TYPE I

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 200 Type设置为I

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> PASV

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 227进入被动模式(xx,xx,xxx,xxx,xxx,xxx)

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> LIST

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 150接受连接

7/26/2010 12:45:05 PM – 用户名(xx.xx.xxx.xxx)>build立数据连接的SSL连接

7/26/2010 12:45:05 PM – username(xx.xx.xxx.xxx)> 226传输OK

7/26/2010 12:46:43 PM – 用户名(xx.xx.xxx.xxx)>断开。

编辑 – 这里是使用FileZilla客户端从同一台机器成功尝试的日志

7/28/2010 10:01:53 AM – (未login)(xx.xx.xxx.xxx)>已连接,正在发送欢迎信息…

7/28/2010 10:01:53 AM – (没有login)(xx.xx.xxx.xxx)> 220-FileZilla服务器版本0.9.32 beta

7/28/2010 10:01:53 AM – (没有登入)(xx.xx.xxx.xxx)> 220 ftp.xxxxxxxx.com

7/28/2010 10:01:53 AM – (未login)(xx.xx.xxx.xxx)>build立了SSL连接

2010/7/28 10:01:53 – (没有login)(xx.xx.xxx.xxx)> USER用户名

2010/7/28 10:01:53 – (没有login)(xx.xx.xxx.xxx)> 331用户名所需的密码

7/28/2010 10:01:53 AM – (没有登入)(xx.xx.xxx.xxx)> PASS ********

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 230login

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> SYST

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> 215由FileZilla模拟的UNIX

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> FEAT

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> 211-特征:

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> MDTM

2010/7/28 10:01:53 – username(xx.xx.xxx.xxx)> REST STREAM

2010/7/28 10:01:53 – username(xx.xx.xxx.xxx)> SIZE

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> MLSTtypes*;大小*;修改*;

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> MLSD

2010/7/28 10:01:53 – username(xx.xx.xxx.xxx)> AUTH SSL

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> AUTH TLS

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> UTF8

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> CLNT

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> MFMT

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 211结束

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> PBSZ 0

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 200 PBSZ = 0

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> PROT P

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 200保护级别设置为P

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)>密码

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 257“/”是当前目录。

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> TYPE I

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 200types设置为I

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> PASV

7/28/2010 10:01:53 AM – username(xx.xx.xxx.xxx)> 227进入被动模式(xx,xx,xxx,xxx,xxx,xxx)

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> MLSD

2010/7/28 10:01:53 – 用户名(xx.xx.xxx.xxx)> 150接受连接

2010/7/28 10:01:53 – username(xx.xx.xxx.xxx)>build立数据连接的SSL连接

7/28/2010 10:01:53 AM – 用户名(xx.xx.xxx.xxx)> 226传输OK

2010/7/28 10:02:18 – 用户名(xx.xx.xxx.xxx)>断开。

处理这些types的问题可能很困难,因为日志通常只告诉你正在发生的事情的一部分。

在这一点上,最好的办法是使用数据包捕获和分析软件(如最优秀的免费Wireshark )来查看线路上发生了什么。

确保您捕获您的机器和远程系统之间的所有stream量,并尝试查看可以在工作连接和代码之间发现什么差异。 这可能会给你一个指示问题出在哪里。

请特别注意TLS连接的方式,因为它可能指出了实际问题(在IBM的文档中有一个相当好的和简单的理解文档)。 例如:

  • 如果证书交换后连接停止,则表明一方不能validation另一方的证书。 这是TLS软件的一个常见问题,特别是使用自签名证书或私有根时。
  • 如果在握手的第一阶段连接中断,可能是客户端和服务器不能约定使用什么协议(通常是因为一方将自己限制为另一方不支持的“安全”协议)。
  • 如果服务器设置了“需要客户端证书”标志,则可能是因为没有设置用于authentication的客户端证书。
  • (等等)

如果您看到TLS通道已经成功关联,那么您必须使用大枪:获取服务器的私钥并解码TLS通信。 这只会是可能的,但是,如果TLS连接不首先使用DH密钥交换 ,禁用在您的服务器或客户端。

一旦DH已被禁用,你有私钥,你可以按照Wireshark的维基页面上关于SSL / TLS的说明,这个说明在相当多的细节上解释了这个过程,或者这个博客文章可能更容易遵循。

我错过了一些明显的东西

你可能会犯一个错误,认为只有一种连接到ftp服务器的方法,因此假设你的代码和FileZilla客户端做的是一样的。

当它没有连接时显示日志。 您需要将其与成功连接的日志进行比较,以了解客户端如何连接。 (它可能不使用AUTH TLS或可能使用被动模式等)

另外,我对FileZilla一无所知,但是configuration(即FTP,TLS和NAT)可能会导致问题,以至于有些FTP服务器将自己描述为NAT-Friendly。