如何保存证书以供 lftp 使用?
从服务器下载时,lftp 不接受有问题的证书。我试过了
openssl s_client -connect {HOSTNAME}:21 -showcerts
从如何将远程服务器 SSL 证书本地保存为文件但这又回来了
CONNECTED(00000003) 3074045628:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:766:
no peer certificate available
我正在连接
lftp -p 21 -u {USER} {HOSTNAME}
并收到
ls: Fatal error: Certificate verification: Not trusted
答案1
我认为这里的问题是 FTP 服务器使用纯 FTP 但支持显式 SSL/TLS。因此,要遵循协议,客户端必须连接到 FTP 服务器并通过 AUTH 命令调用加密。(AUTH 命令以纯文本发送)
因此,回答您的问题,我认为不可能显示证书。除非您可以以某种方式将 AUTH 命令发送到 FTP 服务器。
编辑:要显示证书,请执行以下操作:
openssl s_client -connect xxxx:21 -starttls ftp
答案2
似乎许多系统上的 lftp 配置不正确,导致无法验证服务器证书。也许这就是您遇到的问题的根本原因。
网络上有很多建议通过禁用证书验证或加密来解决这个问题。这是不安全因为它可以让中间人攻击不被察觉。
更好的解决方案是正确配置证书验证,幸运的是,这很容易。为此,请将以下行添加到/etc/lftp.conf
(或替代~/.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
答案3
警告:此处的其他答案会破坏连接安全性
所有那些要求禁用证书验证的答案无疑会削弱安全性,因为它们使连接容易受到中间人攻击。
回答一下这里保护安全的问题
这个问题使用 lftp 信任服务器证书提到此评论FTP SSL/TLS 证书处理 #214在 lftp github 网站上看起来好多了。
简洁版本
set ssl:verify-certificate/FI:NG:ER:PR:IN:T:HE:RE no
完整、已测试、可用版本
对于互动环节
将以交互方式询问密码:
lftp -e "set ssl:verify-certificate/4E:6F:74:20:72:65:61:6C:20:66:69:6E:67:65:72:70:72:69:6E:74 no ; open [email protected]"
对于无人值守的会议
- 将密码放入
~/.netrc
文件中 - 注意语法是在命令内部,而不是
open [email protected]
lftp [email protected]
-c
而不是-e
将执行完整命令然后退出 lftp,或者添加; quit
。
lftp -c "set ssl:verify-certificate/4E:6F:74:20:72:65:61:6C:20:66:69:6E:67:65:72:70:72:69:6E:74 no ; open [email protected] ; cd /some/path/on/server ; mirror "
内容~/.netrc
:
machine machine.domaine.name login myspecificuser password my-specific-password-not-this-one-of-course
答案4
就我而言,问题是由于服务器仅支持现代发行版不支持的 TLS 贬值版本而引起的。
测试是否可以用 openssl 连接:
$ openssl s_client -starttls ftp -connect <hostname>:21
CONNECTED(00000003)
140140192228416:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../ssl/statem/statem_lib.c:1940:
---
<remaining text snipped>
此错误解释如下:https://stackoverflow.com/a/53065682/1878199,tl;dr; debian 现在至少需要 TLS 1.2。
您可以使用 nmap 检查您的服务器支持什么:
$ nmap --script ssl-enum-ciphers -p 21 <hostname>
PORT STATE SERVICE
21/tcp open ftp
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| TLSv1.0:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
|_ least strength: A
(也可以看看https://security.stackexchange.com/a/70737)
所以我的服务器只接受 TLSv1.0。当然,正确的解决方案是更新服务器!
客户端可能的解决方案:
- 使用 SSL
$ lftp -e "set ftp:ssl-auth SSL" <hostname>
- 禁用此连接的 SSL
lftp -e "set ftp:ssl-allow no" <hostname>
/etc/ssl/openssl.cnf
您还可以尝试按照上面第一个链接中的说明进行编辑,以在客户端上启用已过时的协议。不推荐。