如何让 cURL 发送 FTPS 的 AUTH 命令?

如何让 cURL 发送 FTPS 的 AUTH 命令?

这已经引起了很长一段时间的头痛。

情况:我有一个虚拟机,位于代理后面,可以将其与互联网隔离。代理似乎工作正常。

我想使用 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 有所不同。

相关内容