带有私有RSA密钥登录失败的phpseclib 2.0.12 SFTP

时间:2018-11-16 09:59:39

标签: php sftp phpseclib

我使用phpseclib通过RSA私钥登录到SFTP服务器。我正在从PHP 5.3上的phpseclib 1.0升级到PHP 7.2上的phpseclib 2.0.12。 PHP5上的旧代码可以正常工作,但是升级版无法登录,导致以下错误消息:1024连接在3939行的SSH2.php中过早关闭。这是两个不同的版本:

PHP5.3代码上的旧phpseclib1.0(正在运行):

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

PHP7.2代码上的新phpseclib 2.0.12(失败):

$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创建的整数不匹配。但是我不确定这是否与我的问题有关。

从pubseclib1.0更改为__dump($ key):

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

从pubseclib2.0中摘录var_dump($ key):

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

我不知道是导致问题的RSA密钥还是_privatekey_login方法。

1 个答案:

答案 0 :(得分:1)

简短回答

从您的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通常执行的所有步骤。

The documentation不会告诉您执行此操作。您甚至可以了解该方法的唯一方法是查看源代码。根据{{​​1}}上方的PHPDoc注释,很明显,该方法旨在作为私有方法,但您仍在调用它。实际上,它的可比方法在master分支中是私有的。