PHP ssh2_auth_pubkey_file(): аутентификация не удалась с использованием открытого ключа: неверные данные ключа, не закодированные в base64

В PHP5.3.3 (на CentOS и apache2) я пытаюсь подключиться к SFTP через скрипт php. Код извлекает ключи и детали сервера из конструктора

function __construct(){
    $this->host     = 'servername.loc';
    $this->port     = SFTP_PORT;
    $this->auth_user    = 'username';
    $this->auth_pub     = '/data/home/username/.ssh/id_rsa.pub';
    $this->auth_priv    = '/data/home/username/.ssh/id_rsa';
    $this->auth_pass    = null;
    $this->connection   = null;
}

и использует эти детали для создания соединения.

    private function connect(){
    if (!($this->connection = ssh2_connect($this->host, $this->port))) {
        $this->response  = array('code' => "20",
                                 "message" => "Error connecting to SFTP server.");
        return false;
    }
    if (!ssh2_auth_pubkey_file($this->connection, $this->auth_user, $this->auth_pub,
                                $this->auth_priv, $this->auth_pass)) {
        $this->response  = array('code' => "40",
                                 "message" => "Error authenticating to SFTP server with key.");
        $this->disconnect();
        return false;
    }
}

В результате я получаю сообщение об ошибке ssh2_auth_pubkey_file(),

Ошибка:

"* ssh2_auth_pubkey_file (): не удалось выполнить аутентификацию пользователя USERNAME с использованием открытого ключа: неверные данные ключа, не закодированные в base64 *"

На ключе нет пароля, и я могу использовать эти ключи через CLI SSH для подключения к серверу вручную. Я в тупике. Нужно ли как-то кодировать ключи? Предложения?

Заранее спасибо. Gary C - он же Unkul Munki

2 ответа

Условие, которое вы упоминаете, а именно файл pubkey, чтобы не иметь никаких комментариев и даже не иметь завершающего символа новой строки, является неправильным (и символ новой строки очень абсурден, когда вы обдумываете это).

Если ваш скрипт не работает, у вас есть проблема. скорее наткнулся на ошибку ssh2, которая приводит к сбою ssh2, когда он компилируется с помощью libgcrypt вместо openssl. Временное решение: создать копию PEM-файла вашего личного ключа в формате PEM с помощью openssl:

~/.ssh> openssl rsa -in id_rsa -out id_rsa.pem

Затем в ssh2_auth_pubkey_file() в вашем скрипте PHP используйте id_rsa.pem в качестве файла privkey вместо id_rsa и пропустите фразу-пароль. Это должно заставить его работать.

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

d23d23 в gmail dot com сказал: "Открытый ключ должен находиться в одной строке, начиная с типа ключа, 1 пробел и следовать за ключевыми данными (без новых строк), а не после комментариев. Это ограничение libssh2, поэтому удалите все лишние данные из файла после его создания с помощью инструментов генерации ключей."

Поэтому, хотя я использовал openssl для создания закрытого ключа и открытого ключа, мне пришлось отредактировать его, чтобы поместить все в одну строку с типом ключа, как отмечено выше. Благодарю.

Другие вопросы по тегам