![如何让 cURL 发送 FTPS 的 AUTH 命令?](https://linux22.com/image/131146/%E5%A6%82%E4%BD%95%E8%AE%A9%20cURL%20%E5%8F%91%E9%80%81%20FTPS%20%E7%9A%84%20AUTH%20%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
这已经引起了很长一段时间的头痛。
情况:我有一个虚拟机,位于代理后面,可以将其与互联网隔离。代理似乎工作正常。
我想使用 cURL 将 ZIP 文件传输 (-T) 到互联网上的 FTP。 FTP 服务器需要使用 FTPS,即 SSL/TLS。
在我的 Windows 机器上,我可以在 TotalCommander 中使用相同的代理(和相同的代理凭据)来成功建立到我想要使用的 FTP 服务器的 FTPS 会话。
所以我认为 FTP 服务器和代理服务器的配置都可以达到这个目的。
我尝试什么:
基本上我尝试以下命令行的变体:
curl -vvv --ssl -T /path/to/my/file.zip ftp://my.ftpserver.com:21 --user USER:PASSWORD -x https://proxyuser:[email protected]:3128
我在详细输出中看到,cURL 可以针对代理进行身份验证并尝试连接到 FTP 服务器。但是,它不断收到来自 SQUID(代理)的错误:
Squid sent the following FTP command:
USER myftp user
The server responded with:
You must issue the AUTH command to change to an encrypted session before you can attempt to login.
550-This server requires encryption
当我改变目的地时使用 ftps:// 而不是 ftp://它一直告诉我
curl: (35) gnutls_handshake() failed: An unexpected TLS packet was received.
当我查看 Totalcommander FTP 会话的日志时,我发现它针对代理进行了身份验证。然后连接到 FTP 服务器,然后更改为安全模式进行身份验证。
220-Welcome to Company-FTP
220 Company-FTP Server ready!
AUTH TLS
234 Changing to secure mode...
(cert stuff)
USER myftpuser
331 Username OK. Need password.
PASS **********
230 Password oK. Connected. logged in
....
我在这里可能做错什么?
我对此进行了一些研究,并在curl邮件列表中发现了一个帖子,“--tlsv1”选项应该在“AUTH SSL”之前先发送“AUTH TLS”,但是我不认为它已经完成,因为即使我使用- -tlsv1 开关,Squid 将返回相同的错误消息,表示它发送“USER myftpuser”并返回 550 错误。
有没有办法强制 cURL 发送 Totalcommander 似乎发送的“AUTH TLS”,然后成功验证?
非常感谢aslmx
答案1
我相信答案是使用该--ftp-ssl
选项。
我认为这与 openssl 需要该选项的方式类似-starttls ftp
。这些是必需的,因为 FTP 的 TLS 与 HTTP 和其他协议的 TLS 有所不同。