向PHP cURL身份验证添加密钥文件

时间:2018-10-09 18:58:24

标签: authentication curl

我尝试使用PHP&cURL和密钥文件身份验证将文件上传到备份服务器。我创建了一对公钥和私钥,并将公钥存储在备份服务器上。我将私钥上载到名为“ private_key.txt”的文件中的Web服务器。 当我将私钥文件加载到filezilla中进行身份验证时,登录可以正常工作,因此应该正确设置备份服务器。使用PHP cURL,我不断收到“身份验证失败”消息。

这是我的剧本:

$certpath = $_SERVER['DOCUMENT_ROOT'].'private_key.txt';
$curl = curl_init();
$fp = fopen('testfile_ORIG', 'r');

curl_setopt($curl, CURLOPT_URL,"sftp://server.com/is/htdocs/testfile_MOVED");
curl_setopt($curl, CURLOPT_USERNAME, 'user');   
curl_setopt($curl, CURLOPT_SSLKEY, $certpath);
curl_setopt($curl, CURLOPT_SSLENGINE, 'ssh-rsa');   
curl_setopt($curl, CURLOPT_UPLOAD, 1);      
curl_setopt($curl, CURLOPT_INFILE, $fp);

curl_exec ($curl);
echo curl_error($curl);
curl_close ($curl);

有人看到我的失败吗? 我尝试了2天的不同设置,但无法正常工作。 谢谢所有提示

1 个答案:

答案 0 :(得分:0)

您的代码永远不会检查curl_setopt调用是否失败,请解决此问题,并且该错误应清除。也许像

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return true;
}
  • 如果curl_setopt失败,它将引发异常,而不是返回bool(false)。

您这里的实际问题是(可能)您假设$ _SERVER ['DOCUMENT_ROOT']以directory separator(在Mac / linux / bsd / etc系统中为/\在Windows系统中),这是不正确的,不是这样,因此,假设您的www根目录是/srv/http/default/www,而私钥文件是/srv/http/default/www/private_key.txt,您的代码将尝试访问名为{{ 1}}位于文件夹wwwprivate_key.txt中,而不是尝试访问文件夹/srv/http/default中名为private_key.txt的文件-解决方案:

/srv/http/default/www

(常数DIRECTORY_SEPARATOR是php's global constants中的1,在Windows系统上设置为$certpath = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'private_key.txt'; ,其他任何地方都设置为\。)