使用PuTTY .ppk密钥文件在PHP中验证SFTP服务器

时间:2018-04-25 08:03:50

标签: php ssh sftp

我想使用PHP通过SFTP传输文件。

远程服务器提供IP,用户名和密码,包括带密码的PPK文件。我可以使用WinSCP登录,但在我的PHP脚本中我遇到了ssh2_auth_pubkey_file()

的问题

你能告诉我我应该用给定的PPK文件做什么吗? 我需要提供哪些公钥和私钥进行身份验证?

非常感谢明确的解释。谢谢!

代码:

$conn = ssh2_connect($host, $port, array('hostkey'=>'ssh-rsa'));
if(ssh2_auth_pubkey_file($conn,$username,$pub_key,$pri_key,$passphrase)){
  echo "Public Key Authentication Successful\n";
}else{
  die('Public Key Authentication Failed');  
}

我使用的公钥来自PuTTYgen。 将PPK转换为PUB文件。

1 个答案:

答案 0 :(得分:1)

函数ssh2_auth_pubkey_file接受公共OpenSSH格式的公钥和私钥文件。

从PuTTY .ppk密钥文件生成这些文件:

  • 开始PuTTYgen并加载您的.ppk密钥。
  • 使用公钥的内容粘贴到OpenSSH authorized_keys文件中获取公钥文件。
  • 使用转化次数>导出OpenSSH密钥菜单命令以生成私钥文件。

保存文件的位置无关紧要,只要网络服务器可以访问这些文件。

似乎有bug in PHP SSH2 functions that prevents loading encrypted private keys(带密码的密钥)。

该错误导致:

  

ssh2_auth_pubkey_file():使用公钥验证失败:回调返回错误

如果您想使用私钥,而无法修复SSH库,则可以使用phpseclib代替。

set_include_path("phpseclib");
require_once("Net/SSH2.php");
require_once("Crypt/RSA.php");

$privatekey = new Crypt_RSA();
$privatekey_data = file_get_contents($pri_key);

$privatekey->setPassword($passphrase);
if (!$privatekey->loadKey($privatekey_data, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))
{
    die("Cannot load key");
}

$sftp = new Net_SSH2($host);

if (!$sftp->login($username, $privatekey))
{
    die("Cannot login");
}

phpseclib甚至支持.ppk密钥,但我也无法使用加密的.ppk密钥。但加密的OpenSSH密钥正常工作。请注意,您不需要使用phpseclib单独的公钥文件。