如何让lftp从命令行使用SSL / TLS安全机制?

时间:2014-05-27 22:35:52

标签: ubuntu ftp ftps lftp

我尝试登录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.

8 个答案:

答案 0 :(得分:16)

  

lftp:〜&gt;设置ssl-allow false

您已明确将ssl-allow设置为false。但如果lftp尝试使用SSL,则必须如此。

答案 1 :(得分:10)

似乎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

答案 2 :(得分:8)

您可能还需要

set ssl:verify-certificate no

答案 3 :(得分:3)

设置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

答案 4 :(得分:1)

lftp版本必须是&gt; = 4.6.3(Debian用户)

答案 5 :(得分:1)

我的回答为您系统上的单个用户提供访问权限,而不是系统范围的证书。

lftp 使用传输层安全性 (TLS)。所以一定要先从FTP服务器上获取证书。

openssl s_client -connect <ftp-hostname>:21 -starttls ftp

我将整个证书链包含在本地 cert.crt 文件夹中名为 ~/.lftp 的新文件中。至少,您希望包含证书本身的所有文本: -----BEGIN CERTIFICATE----- <...> -----END CERTIFICATE-----

  • 我在本地 rc 文件夹中创建了一个名为 ~/.lftp 的文件并添加了几行
    • 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

答案 6 :(得分:0)

这对于使用lftp的FTPS服务器连接(具有990端口,但无需指定)的工作很有效

代码: lftp ftps://USER:PASSWORD@server.com -c "set ssl:verify-certificate false;"

然后: 做东西

更多信息,请访问: how-to-avoid-lftp-certificate-verification-error

答案 7 :(得分:0)

使用lftp逐步解决了我的问题:

    使用openssl s_client -connect <ftp_hostname>:21 -starttls ftp
  1. 获取主机证书,结果开始时,我得到了类似-----BEGIN CERTIFICATE----- MIIEQzCCAyu.....XjMO -----END CERTIFICATE-----
  2. 的信息。
  3. 复制-----BEGIN CERTIFICATE----- MIIEQzCCAyu.....XjMO -----END CERTIFICATE----- /etc/ssl/certs/ca-certificates.crt
  4. 进入 lftp配置,引用此证书文件添加到/etc/lftp.conf,以用于系统范围的set ssl:ca-file "/etc/ssl/certs/ca-certificates.crt"
  5. 然后使用lftp进行同步或其他操作,就我而言,它是lftp -u "${FTP_USER},${FTP_PWD}" ${FTP_HOST} -e "set net:timeout 10;mirror ${EXCLUDES} -R ${LOCAL_SOURCE_PATH} ${REMOTE_DEST_PATH} ; quit"