我正在学习如何使用'phpseclib'库。
我已成功设法通过SSH使用用户名/密码组合进行连接。
我想现在使用私钥连接,但我似乎无法做到。让我解释一下我是如何做到这一点的,希望有人可以指出我的错误。
<?php
use phpseclib\Net\SSH2;
use phpseclib\Crypt\RSA;
include('vendor/autoload.php');
define('NET_SSH2_LOGGING', SSH2::LOG_COMPLEX);
$ssh = new SSH2('MYIP');
$rsa = new RSA();
$rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_OPENSSH);
extract($rsa->createKey(2048));
file_put_contents('privatekey', $privatekey);
if($rsa->loadKey(file_get_contents('privatekey')))
{
echo('Key loaded');
} else {
throw new Exception('Key not loaded');
}
if($ssh->login('chris', $rsa))
{
echo('Connected');
} else {
echo $ssh->getLastError();
throw new Exception('Not Connected');
}
如您所见,我将公钥格式设置为'openssh',然后创建密钥。使用createKey
方法创建的值,我将该键放在一个名为“privatekey”的文件中(没有扩展名,但不确定是否需要,因为它只是文本)。然后正常,加载密钥并将其用作登录中的值。
我已经使用过官方文档(这些文档并不是很棒)和谷歌一起使用,而且我也没有太多运气。
getLastError
的输出是:
SSH_MSG_USERAUTH_FAILURE:publickey,密码
提前感谢您的任何帮助。
答案 0 :(得分:2)
您可以在客户端整天创建密钥对,但除非您生成的密钥对的公共部分位于/home/user/.ssh/authorized_keys
文件中,否则无关紧要。如果您正在创建密钥并尝试在同一个脚本中与它们连接...那么它们不太可能存在于该文件中。
在这种特殊情况下,您应该加载一个私钥,其对应的公钥已经在/home/user/.ssh/authorized_keys
文件中。加载$rsa->loadKey(...)
和/然后尝试在SSH的登录方法中使用该RSA对象。
答案 1 :(得分:1)
我自己已经弄清楚了。
我自己的愚蠢......
我没有将$publickey
放在authorized_keys
文件中。
公平地说,遗憾的是,它不像他们关于这个库的最近的文档。
感谢@PoX的帮助。
答案 2 :(得分:0)
您的代码看起来正确我认为您收到此错误是因为您没有正确配置ssh服务器。
签入sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
同时确保您对/home/chris/.ssh/
拥有正确的权限
如果您将authorized_keys
保留在其他地方,则需要在sshd_config
中配置
AuthorizedKeysFile %h/.ssh/authorized_keys
和权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys