首页 > 解决方案 > phpseclib ssh 登录失败,没有错误

问题描述

这是我的代码:

error_reporting(E_ALL);
require __DIR__ . '/vendor/autoload.php';

use phpseclib\Net\SSH2;
use phpseclib\Crypt\RSA;

$ssh = new SSH2('stg.net');
$key = new RSA();
$key->loadKey(file_get_contents('/Users/me/.ssh/my_private_key'));
if (!$ssh->login('username', $key)) {
    print_r($ssh->getLastError());
    print_r($ssh->getErrors());
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');

输出:

Array
(
)

vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php里面有function _privatekey_login($username, $privatekey)

$publickey = $privatekey->getPublicKey(RSA::PUBLIC_FORMAT_RAW);
if ($publickey === false) {
    return false;
}

我得到了false,也许我也必须设置公钥?如何做呢?如何调试它?

+++ 更新 +++

我也尝试了这些票的建议/提示:

phpseclib 总是给登录失败,没有日志

Net/SSH2 - phpseclib 登录失败 - 错误:“failedArray”

标签: sshphpseclib

解决方案


问题是所讨论的密钥是 ECDSA 密钥。引用https://github.com/phpseclib/phpseclib/issues/1082#issuecomment-396122366

我的库支持 OpenSSH 格式(即ssh-keygen会生成的那种)、PuTTY 格式(即 puttygen会生成的那种)、libsodium 格式和此 IETF 草案中指定的格式的 EdDSA 密钥:

https://datatracker.ietf.org/doc/html/draft-ietf-curdle-pkix-07

如果正在使用 libsodium / sodium_compat,则密钥将从它们所采用的任何格式转换为 libsodium 格式,以方便 libsodium 的使用。

不支持加密的 OpenSSH 私钥的原因与 sodium_compat 不支持 Argon2i 的原因相同——它太慢了。OpenSSH 使用自定义形式的 bcrypt,我记得它执行 bcrypt 128 次并加密不同的字符串等,因此无法使用 PHP 的 bcrypt 实现,并且由于 bcrypt 使用自定义密钥扩展 OpenSSL 的 Blowfish 实现也不能使用。

在这里,作者谈论的是 EdDSA——不是 ECDSA——但从帖子的其余部分来看,听起来像素数有限域上的 ECDSA 也是完整的。

引用该帖子后面的帖子:

另外,我还没有准备好公开我的代码。我只是想我会为任何感兴趣的人发布进度报告。

我的猜测是这个实现将存在于 master 分支而不是 2.0 分支中。我这么说是因为 DSA 更改是在主分支而不是 2.0 分支中。最终,主分支(据我所知)将变为 3.0.0,但在这种情况发生时会出现 idk。


推荐阅读