我想使用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文件。
答案 0 :(得分:1)
函数ssh2_auth_pubkey_file
接受公共OpenSSH格式的公钥和私钥文件。
从PuTTY .ppk
密钥文件生成这些文件:
.ppk
密钥。保存文件的位置无关紧要,只要网络服务器可以访问这些文件。
似乎有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单独的公钥文件。