我使用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方法。
答案 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分支中是私有的。