ssh - 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
,也许我也必须设置公钥?如何做呢?如何调试它?
+++ 更新 +++
我也尝试了这些票的建议/提示:
解决方案
问题是所讨论的密钥是 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。
推荐阅读
- r - R如何区分dplyr包中的两个过滤器函数和时间序列中的线性过滤器?
- node.js - 如何遍历 Postman 中的数组?
- sql - 错误:列“user1”不存在,在插入 postgres 表时发生
- typescript - 如何使用 TypeScript 将 express 标头作为字符串传递给函数?
- react-navigation - 为抽屉导航设置标题
- java - 可以使用 Firebase Admin SDK 将消息发送到一批令牌到 FCM 客户端吗?
- regex - 用双引号替换单引号,当且仅当引号在特定字符串之后
- javascript - jquery自动完成建议出现在页面底部
- p5.js - 用 Paper.js 填充空间的有机形状
- mongodb - MongoDB Compass - 卡在连接到 Atlas