phpseclib 2.0.12 SFTP с ошибкой входа с закрытым ключом RSA - PullRequest
0 голосов
/ 16 ноября 2018

Я использую phpseclib для входа на SFTP-сервер с использованием закрытого ключа RSA. Я обновляю phpseclib 1.0 на PHP 5.3 до phpseclib 2.0.12 на PHP 7.2. Старый код на PHP5 работает просто отлично, но обновленная версия не может войти в систему, что приводит к следующему сообщению об ошибке: 1024 Соединение преждевременно закрыто в SSH2.php в строке 3939. Вот две разные версии:

СТАРЫЙ phpseclib1.0 на PHP5.3 КОД (работает):

$key = new Crypt_RSA();
$key->loadKey(file_get_contents('rsaprivate.key'));
$sftp = new Net_SFTP('urltosftpserver');
$sftp->login('username', $key)

НОВЫЙ phpseclib 2.0.12 на КОДЕ PHP7.2 (сбой):

$key = new phpseclib\Crypt\RSA();
$key->loadKey(file_get_contents(__DIR__.'/rsaprivate.key'));
$sftp = new phpseclib\Net\SFTP('urltosftpserver');
$sftp->_privatekey_login("username", $key);

Когда я смотрю на значение $ key, они не совпадают в двух разных версиях моего кода. phpseclib1.0 создает целые числа для значения, а phpseclib2.0 создает шестнадцатеричные числа. Когда я конвертирую шестнадцатеричные числа pubseclib 2.0 в целые числа, они не совпадают с целыми числами, созданными pubseclib 1.0. Но я не уверен, что это как-то связано с моей проблемой.

SNIPPLET FROM pubseclib1.0 var_dump ($ key):

[value] => 42318...
[is_negative] => 
[generator] => mt_rand
[precision] => -1
[bitmask] => 
[hex] => 

SNIPPLET FROM pubseclib2.0 var_dump ($ key):

[value] => 0x60f23...
[engine] => bcmath (OpenSSL)

Я не знаю, что именно ключ RSA вызывает проблему или метод _privatekey_login.

1 Ответ

0 голосов
/ 17 ноября 2018

Короткий ответ

Из вашего кода 2.0:

$sftp->_privatekey_login("username", $key);

Не делай этого. Сделайте это:

$sftp->login("username", $key);

Длинный ответ

login звонит _login, что звонит _connect и _login_helper. _connect - это то, где fsockopen называется. _login_hepler затем условно звонит _privatekey_login. Вызывая _privatekey_login напрямую, вы обходите все шаги, которые обычно делает phpseclib.

Документация не говорит вам сделать это. Единственный способ, которым вы могли бы даже узнать об этом методе, это посмотреть на исходный код. Согласно комментариям PHPDoc выше _privatekey_login ясно, что этот метод предназначен для использования в качестве частного метода, и все же вы все еще вызываете его. Действительно, это сопоставимый метод, приватный в основной ветке.

...