使用PHPSECLIB通过SSH与RSA连接

时间:2016-01-17 00:39:31

标签: php ssh rsa phpseclib

我正在学习如何使用'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,密码

提前感谢您的任何帮助。

3 个答案:

答案 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