Выполните аутентификацию на SFTP-сервере в PHP с помощью файла ключей PuTTY .ppk - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу передавать файлы через SFTP, используя PHP.

Удаленный сервер предоставляет 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 голосов
/ 26 апреля 2018

Функция ssh2_auth_pubkey_file принимает файлы открытого и закрытого ключей в общем формате OpenSSH.

Чтобы сгенерировать эти файлы из файла ключей PuTTY .ppk:

  • Запустите PuTTYgen и загрузите ключ .ppk.
  • Использовать содержимое Открытый ключ для вставки в файл авторизованных ключей OpenSSH для файла открытого ключа.
  • Используйте Преобразования> Экспортировать ключ OpenSSH Команда меню для создания файла закрытого ключа.

Неважно, где вы сохраняете файлы, если веб-сервер может получить к ним доступ.


Кажется, есть ошибка в функциях PHP SSH2, которая не позволяет загружать зашифрованные закрытые ключи (ключи с парольной фразой).

Ошибка приводит к:

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.

...