4

我有一些 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

任何帮助表示赞赏

4

4 回答 4

7

当您的 libssh2 使用 libgcrypt 构建时,有些情况(基于 debian 的发行版)。其中,使用 PEM 编码的私钥文件:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
于 2013-07-26T14:38:41.173 回答
3

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

于 2013-02-07T20:58:10.503 回答
0

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');
?>
于 2013-02-14T13:46:09.503 回答
0

Debian 发行版(例如 Ubuntu LTS 14.04)中的 libssh2 使用不支持密码短语的 libgcrypt。使用没有密码的密钥或生成 PEM 密钥,如 Alexander 的回答所述。

可以在以下链接上找到更多信息: 尝试使用 ssh2_auth_pubkey_file() 进行连接

于 2015-07-13T06:04:34.230 回答