我正在尝试登录ftps
网站。我试过在命令行给出登录凭证(并将set
参数放在~/.lftprc
中,然后打开lftp
会话并使用lftp
作业控制语句键入这些参数。无论如何,我总是碰到同样的障碍:
421 Sorry, cleartext sessions are not accepted on this server.
Please reconnect using SSL/TLS security mechanisms.
我用下面的参数得到了最大的结果,但仍然得到上面的错误。
如何从命令行获得lftp
使用SSL/TLS安全机制?
目标是使用bash编写访问ftps站点的脚本(不使用expect
编程)。
lftp
lftp :~> set ssl-allow false
lftp :~> set passive-mode yes
lftp :~> open ftp.abc.com
lftp ftp.abc.com:~> login theuser
Password:
lftp theuser@ftp.abc.com:~> cd
`cd' at 0 [Delaying before reconnect: 26]
CTRL-C
lftp theuser@ftp.abc.com:~> debug
lftp theuser@ftp.abc.com:~> cd
---- Connecting to ftp.abc.com (XX.XXX.XX.XX) port 21
<--- 220-Welcome to the Yahoo! Web Hosting FTP server
<--- 220-Need help? Get all details at:
<--- 220-http://help.yahoo.com/help/us/webhosting/gftp/
<--- 220-
<--- 220-No anonymous logins accepted.
<--- 220-Yahoo!
<--- 220-Local time is now 15:30. Server port: 21.
<--- 220-This is a private system - No anonymous login
<--- 220 You will be disconnected after 5 minutes of inactivity.
---> FEAT
<--- 211-Extensions supported:
<--- EPRT
<--- IDLE
<--- MDTM
<--- SIZE
<--- MFMT
<--- REST STREAM
<--- MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
<--- MLSD
<--- XDBG
<--- AUTH TLS
<--- PBSZ
<--- PROT
<--- TVFS
<--- ESTA
<--- PASV
<--- EPSV
<--- SPSV
<--- ESTP
<--- 211 End.
---> OPTS MLST type;size;modify;UNIX.mode;UNIX.uid;UNIX.gid;
<--- 200 MLST OPTS type;size;sizd;modify;UNIX.mode;UNIX.uid;UNIX.gid;unique;
---> USER theuser
<--- 421 Sorry, cleartext sessions are not accepted on this server.
Please reconnect using SSL/TLS security mechanisms.
似乎lftp在许多系统上没有正确配置,这使得它无法验证服务器证书(产生Fatal error: Certificate verification: Not trusted
)。
网上(以及这篇文章中的答案)充满了通过禁用证书验证或加密来解决这个问题的建议。这是不安全的,因为它允许中间人攻击不被注意。
更好的解决方案是正确配置证书验证,幸运的是,这很容易。为此,将以下行添加到/etc/lftp.conf
(或~/.lftp/rc
或~/.config/lftp/rc
):
set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
ca-certificates.crt
是包含系统所有CA证书的文件。上面使用的是Ubuntu的位置,在不同的系统上可能会有所不同。要生成或更新该文件,请运行update-ca-certificates
:
sudo update-ca-certificates
如果您的系统没有这个命令,您可以像这样手动创建一个:
cat /etc/ssl/certs/*.pem | sudo tee /etc/ssl/certs/ca-certificates.crt > /dev/null
lftp:~> set ssl-allow false
您已经显式地将ssl-allow设置为false。但是,如果lftp要尝试使用SSL,则必须为真。
您可能还需要
set ssl:verify-certificate no
我的答案是为系统上的单个用户提供访问权限,而不是系统范围的证书。
lftp使用TLS (Transport Layer Security)。因此,首先必须从FTP服务器获取证书。
openssl s_client -connect <ftp-hostname>:21 -starttls ftp
我将整个证书链包含在本地~/.lftp
文件夹中名为cert.crt
的新文件中。至少,您希望包含证书本身的所有文本: -----BEGIN CERTIFICATE----- <...> -----END CERTIFICATE-----
。
- 我在本地
~/.lftp
文件夹中创建一个名为rc
的文件,并添加行-
set ssl:ca-file “cert.crt”
-
set ssl:check-hostname no
(这可以防止Fatal error: Certificate verification: certificate common name doesn't match requested host name ‘<ftp-hostname>’
在远程运行ls
命令时)
-
设置ftp:ssl-allow true
不适合我。
输入set
:
lftp :~> set
我注意到这个:
set ftp:ssl-allow true
set ftp:ssl-allow/XXX.XXX.XXX.XXX no
以XXX.XXX.XXX.XXX为服务器,我正在登录。
所以我需要的最后一组命令是:lftp :~> set ftp:ssl-allow true
lftp :~> set ftp:ssl-allow/XXX.XXX.XXX.XXX true
lftp :~> set ssl:verify-certificate no
lftp版本必须>= 4.6.3 (Debian用户)
lftp是如何一步步为我工作的:
-
获得证书的主机与
openssl s_client -connect <ftp_hostname>:21 -starttls ftp
,在结果的开始,我得到的东西像-----BEGIN CERTIFICATE----- MIIEQzCCAyu.....XjMO -----END CERTIFICATE-----
-
,
-----BEGIN CERTIFICATE----- MIIEQzCCAyu.....XjMO -----END CERTIFICATE-----
到/etc/ssl/certs/ca-certificates.crt
- 进入lftp配置引用此证书文件添加到
/etc/lftp.conf
以用于系统范围的set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
然后与
lftp
进行同步,在我的例子中是lftp -u "${FTP_USER},${FTP_PWD}" ${FTP_HOST} -e "set net:timeout 10;mirror ${EXCLUDES} -R ${LOCAL_SOURCE_PATH} ${REMOTE_DEST_PATH} ; quit"
对于使用lftp的FTPS服务器连接(使用端口990,但不需要指定),这对我来说是有效的
代码:lftp ftps://USER:PASSWORD@server.com -c "set ssl:verify-certificate false;"
:做的东西
更多信息:how-to-avoid-lftp-certificate-verification-error