【问题标题】:Authenticate to SFTP server in PHP with PuTTY .ppk key file使用 PuTTY .ppk 密钥文件在 PHP 中对 SFTP 服务器进行身份验证
【发布时间】:2018-10-05 14:53:50
【问题描述】:

我想使用 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 文件。

【问题讨论】:

    标签: php ssh sftp


    【解决方案1】:

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

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

    • 启动 PuTTYgen 并加载您的 .ppk 密钥。
    • 使用 Public key 的内容粘贴到 OpenSSH authorized_keys 文件中 获取公钥文件。
    • 使用Conversions > Export OpenSSH key菜单命令生成私钥文件。

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


    似乎有一个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 的公钥文件。

    【讨论】:

      猜你喜欢
      • 2018-05-05
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2020-10-11
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多