【问题标题】:LIBCURL C SFTP Authentication with both public key and passwordLIBCURL C SFTP 使用公钥和密码进行身份验证
【发布时间】:2023-02-08 03:04:07
【问题描述】:

我正在开发一个 C/C++ 应用程序,它使用带有 lib-curl 的 SFTP 协议执行文件传输。但是,我面临一个特定的问题,即需要远程主机两个都公钥和用户密码认证分两步进行。

在这种情况下我应该如何配置 CURLOPT 参数?我目前正在我的应用程序中实现类似的东西:

curl_easy_setopt(curl, CURLOPT_URL, myurl.Str);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &sftpfile);
curl_easy_setopt(curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_ANY);
curl_easy_setopt(curl, CURLOPT_USERNAME, sUser.Str());
curl_easy_setopt(curl, CURLOPT_PASSWORD, "sUserPassword.Str()");
if (!sPrivateKeyFile.IsEmptyString()) {
    curl_easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE, sPrivateKeyFile.Str());
}
if (!sPublicKeyFile.IsEmptyString()) {
    curl_easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE, sPublicKeyFile.Str());
}
if (!sKnownHosts.IsEmptyString()) {
    curl_easy_setopt(curl, CURLOPT_SSH_KNOWNHOSTS, sKnownHostsFile.Str());
}
if (!sPassword.IsEmptyString()) {
    curl_easy_setopt(curl, CURLOPT_KEYPASSWD, sPassword.Str());
}
#ifdef _CURL_VERBOSE
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
#endif

当我运行我的应用程序时,我注意到 PEM 密钥对已成功读取,并且我收到了 curl failure 67 身份验证消息。

我想知道 libcurl 是否支持通过分两步使用公钥和用户密码身份验证来进行身份验证。

此致,

【问题讨论】:

  • 你解决了这个问题吗?如果是这样,你能告诉我怎么做吗。或发布您自己的答案。
  • 不,我还没有解决这个问题。

标签: passwords sftp libcurl public-key


【解决方案1】:

您不需要私钥,只需要 .ssh 目录中的公钥。
我不明白你为什么说这是一个两步过程。
您只需要主机指纹或使用CURLOPT_SSL_VERIFYHOST, 0); 跳过验证。

昨晚我试图用 curl 在 PHP 中做同样的事情。
我让它工作了。
这个应用程序只是读取文件夹中的文件。
我将很快(今天)拥有 curl 写入文件应用程序。

我的问题是主机有用户和密码。

$url = "sftp://$user:$password@$host";

我把用户名和密码移到了CURLOPT_USERPWD

$host = "72.000.000.111/home/user/public_html/";
$username = "user";
$password = "pass!";

$url = "sftp://@$host";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);  
curl_setopt($ch, CURLOPT_DIRLISTONLY, '1L');// just want file names
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_TIMEOUT,2);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch); 
$error = curl_error($ch);
curl_close($ch);
echo "error: $error<br>
";
echo "response <PRE>$response<br>";

在寻找解决方案时,有些人通过相反的方式解决了问题。从 CURLOPT_USERPWD 到 sftp://user:pass@host
猜想这取决于 SFTP 服务器。

我发现有问题的一件事是公钥。
即通过读取公钥来验证源位置。

对于可能对我来说并不重要的应用程序。
所以我只是没有验证主机CURLOPT_SSL_VERIFYHOST, 0)
我本可以将主机添加到 .ssh,但我需要 MD5 来创建 .ppk,并且只有 SHA256 指纹。所以我跳过了主机验证。
我相信这也是您唯一需要的步骤。

在我的 Win10 工作站上,我所要做的就是使用 FileZilla 进行连接并单击“始终信任此主机,将此密钥添加到缓存”复选框。

所以我很确定你只需要 MD5 指纹。
从指纹制作一个 .ppk 文件。
并将 .ppk 放在 .ssh 目录中。
并且可能会消除一些 CURLOPT。

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多