Php cURL sftp公钥身份验证失败“;“回调错误”;

Php cURL sftp公钥身份验证失败“;“回调错误”;,php,curl,ftp,sftp,scp,Php,Curl,Ftp,Sftp,Scp,我有一些php代码,它可以很好地使用cURL将文件上传到主机,而主机只是使用用户和密码ftp,现在我必须上传到一个只允许公钥身份验证的服务器,并且得到错误:“*SSH公钥身份验证失败:回调返回错误” 我对密钥有一个问题,因为它们的格式不正确,但后来将它们放在正确的单行格式中,这就停止了“非base64编码”错误。我在网上找不到有关此回调错误的帮助 我的代码如下 $ch = curl_init(); curl_setopt($ch, CURLOPT_VERBOSE, TRUE); curl_se

我有一些php代码,它可以很好地使用cURL将文件上传到主机,而主机只是使用用户和密码ftp,现在我必须上传到一个只允许公钥身份验证的服务器,并且得到错误:“*SSH公钥身份验证失败:回调返回错误”

我对密钥有一个问题,因为它们的格式不正确,但后来将它们放在正确的单行格式中,这就停止了“非base64编码”错误。我在网上找不到有关此回调错误的帮助

我的代码如下

$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
curl_setopt($ch, CURLOPT_URL, 'sftp://user:@12.12.12.12:22/testfile.gz');
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_SSH_PUBLIC_KEYFILE,'C:\keys\public.pub');
curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE,'C:\keys\private.ppk');
curl_setopt($ch, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,'2acfe24108c37a276a93ac3398a5oe8f');
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES,CURLSSH_AUTH_PUBLICKEY);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
$fp = fopen($localfile, 'r');
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
$sR = curl_exec ($ch);
下面是运行测试的输出

* About to connect() to 12.12.12.12 port 22 (#0)
*   Trying 12.12.12.12...
* connected
* Connected to 12.12.12.12 (12.12.12.12) port 22 (#0)
* SSH MD5 fingerprint: ebbc61b886c798b25073c912833ffers
* SSH authentication methods available: publickey
* Using ssh public key file C:\keys\public.pub
* Using ssh private key file C:\keys\private.ppk
* SSH public key authentication failed: Callback returned error
* Authentication failure
* Closing connection #0

任何值得赞赏的帮助

ppk都是putty putty私钥,您需要将其导出为一个开放的(使用puttygen go Conversations->export OpenSSH)

您可能会更幸运地使用phpseclib,一个纯PHP SFTP实现。例如

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
?>

在某些情况下(基于debian的发行版),您的libssh2是使用libgcrypt构建的。 在这些情况下,使用PEM编码的私钥文件:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

Debian发行版(例如UbuntuLTS14.04)中的libssh2使用不支持密码短语的libgcrypt。按照Alexander的回答,使用不带密码短语的密钥或生成PEM密钥

有关更多信息,请访问以下链接:

我尝试过这个-我转换了密钥,得到了完全相同的结果。您是否确保将您的公钥添加到/home/user/.ssh/authorized_-keys中?我正在从windows计算机复制,但我已经将authorized_-keys文件保存在其中。非常感谢。这为我解决了一个问题:)感谢您澄清这一点,并使用curl&libssh2为我节省了大量调试时间。我使用了一个带有密码短语的密钥,尽管每个选项都是正确的,但我一直得到OP的错误。使用如上所述的PEM密钥或使用没有密码短语的普通ssh密钥允许客户端进行连接。据我所知,PEM密钥(用于OpenSSL证书,但也用于ssh密钥)同时包含密钥和密码短语,因此就像根本没有密钥一样。UbuntuLTS14.04中的libssh2使用libgcrypt,我发现它不支持密码短语。因此,请再次使用PEM密钥或不带密码短语的密钥。