6

我正在尝试连接到 FTPS 服务器(不是 SFTP)。我是从 linux 系统连接的,所以我尝试了 lftp、ftp-ssl,甚至使用了 php 的 ftp_ssl_connect,但它们都不起作用。(我已经能够使用上述全部或至少部分方法连接到其他 FTPS 服务器)。

我遇到的最具描述性的错误是从 lftp 一直调试到 11:

$ lftp
lftp :~> open -u my-username ftps://server.net
密码:
lftp my-username@server.net:~> debug 99999999999
lftp my-username@server.net:~> ls
FileCopy(0x717bf0) 进入初始状态
FileCopy(0x717bf0) 进入状态 DO_COPY
---- dns缓存命中
---- 连接到 server.net (IP ADDRESS) 端口 990
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_RSA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_RSA_CAMELLIA_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_RSA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_RSA_CAMELLIA_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_RSA_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_CAMELLIA_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_CAMELLIA_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:DHE_DSS_ARCFOUR_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:DHE_PSK_SHA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:DHE_PSK_SHA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:DHE_PSK_SHA_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:DHE_PSK_SHA_ARCFOUR_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_RSA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_RSA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_RSA_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_DSS_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_DSS_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_DSS_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_CAMELLIA_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_CAMELLIA_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_ARCFOUR_SHA1
GNUTLS:HSK[acfbb0]:保存密码套件:RSA_ARCFOUR_MD5
GNUTLS:HSK[acfbb0]:删除密码套件:PSK_SHA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:PSK_SHA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:PSK_SHA_3DES_EDE_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:PSK_SHA_ARCFOUR_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_AES_128_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_AES_256_CBC_SHA1
GNUTLS:HSK[acfbb0]:删除密码套件:SRP_SHA_3DES_EDE_CBC_SHA1
GNUTLS:EXT[acfbb0]:发送扩展 CERT_TYPE
GNUTLS: HSK[acfbb0]: CLIENT HELLO 已发送 [88 字节]
GNUTLS:REC[acfbb0]:发送数据包[0]握手(22),长度:88
GNUTLS:断言:gnutls_cipher.c:205
GNUTLS:REC[acfbb0]:发送数据包[1]握手(22),长度:93
GNUTLS:断言:gnutls_buffers.c:638
GNUTLS:断言:gnutls_record.c:909
GNUTLS:断言:gnutls_buffers.c:1152
GNUTLS:断言:gnutls_handshake.c:1032
GNUTLS:断言:gnutls_handshake.c:2331
**** gnutls_handshake:收到了一个长度意外的 TLS 数据包。
---- 关闭控制插座
ls: 致命错误: gnutls_handshake: 收到了一个意外长度的 TLS 数据包。

使用 PHP,我得到以下信息:

警告:ftp_login(): SSL/TLS 握手在第 7 行的 /home/user/ftp.php 中失败
警告:ftp_login(): SSL enabled 在第 7 行的 /home/user/ftp.php 中启动协商
无法登录

第 6 行:$connect = ftp_ssl_connect("server.net") or die("cannot connect");

第 7 行:$result = ftp_login($connect,"my-username","my-password") or die("cannot login");

使用 ftp-ssl:

$ ftp-ssl -d -z 调试 server.net
SSL_DEBUG_FLAG 开启
连接到 server.net。
220-安全通知
220-可以监控所有活动。系统使用表示同意
220监控。信息可能会提供给执法部门。
ftp: setsockopt: 错误的文件描述符
名称(server.net:user):我的用户名
---> 认证 SSL
234 SSL enabled 开始协商
写入 0x68c190 (102 字节 => 102 (66))
0000 - 80 64 01 03 01 00 4b 00-00 00 10 00 00 39 00 00 .d........K......9..
0010 - 38 00 00 35 00 00 16 00-00 13 00 00 0a 07 00 c0 8..5............
0020 - 00 00 33 00 00 32 00 00-2f 03 00 80 00 00 05 00 ..3..2../........
0030 - 00 04 01 00 80 00 00 15-00 00 12 00 00 09 06 00 ......
0040 - 40 00 00 14 00 00 11 00-00 08 00 00 06 04 00 80 @................
0050 - 00 00 03 02 00 80 e9 28-25 ed ea 2d e4 d2 f2 25 ........(%..-...%
0060 - 80 e1 2e f1 c3 71 .....q
从 0x68c190 读取(7 个字节 => -1 (FFFFFFFFFFFFFFFF))
ftp: SSL_connect 错误错误:00000000:lib(0):func(0):reason(0)
:对等方重置连接

对不起,如果这篇文章很长,但我已经搜索了好几天没有看到答案。只是希望我错过的一些调试信息对某人有用。

4

2 回答 2

3

在 debian 上遇到相同错误时:

---- Closing control socket
ls: Fatal error: gnutls_handshake: An unexpected TLS packet was received.

首先,我必须在 debian 上升级 ssl-cert 包:

$ sudo apt-get upgrade ssl-cert

然后我不得不使用 open ftp://而不是open ftps://:

lftp :~> open ftp://xxx.xxx.xxx.xxx:21
ltfp :~> user foo bar

然后错误变为:

lftp foo@xxx.xxx.xxx.xxxx:~> ls

ls: Fatal error: Certificate verification: Not trusted (XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX)

此选项消除了错误并允许访问:

lftp foo@xxx.xxx.xxx.xxxx:~> set ssl:verify-certificate no
于 2019-02-20T15:58:04.723 回答
1

看起来服务器使用了不兼容或无效的密钥交换算法。尝试使用 Wireshark 捕获客户端和服务器之间的数据包,这可能会对问题有所了解。此外,您可以尝试启用/禁用某些密钥交换算法。

于 2010-08-24T09:17:49.910 回答