使用 PHPSECLIB 通过 SSH 与 RSA 连接
Connecting via SSH with RSA using PHPSECLIB
我正在学习如何使用 'phpseclib' 库。
我已成功使用 username/password 组合通过 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');
}
如您所见,我将 public 密钥格式设置为 'openssh',然后创建密钥。使用 createKey
方法创建的值,我将该键放入一个名为 'privatekey' 的文件中(没有扩展名,但不确定是否需要,因为它只是文本)。然后就正常了,加载key,作为login中的value使用。
我已经使用了官方文档(不是很好)并且 Google 到处都是,但我都没有太多运气。
getLastError
的输出是:
SSH_MSG_USERAUTH_FAILURE: publickey,password
在此先感谢您的帮助。
您的代码看起来是正确的我认为您收到此错误是因为您没有正确配置 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
您可以整天在客户端创建密钥对,但除非您生成的密钥对的 public 部分在 /home/user/.ssh/authorized_keys
文件中,否则这无关紧要。如果您正在创建密钥并尝试在同一个脚本中连接它们……它们不太可能在那个文件中。
在这种特殊情况下,您应该加载一个私钥,其对应的 public 密钥已经在 /home/user/.ssh/authorized_keys
文件中。使用 $rsa->loadKey(...)
加载它并/然后/尝试在 SSH 的登录方法中使用该 RSA 对象。
我自己想出来了。
我自己的愚蠢...
我没有将 $publickey
放入 authorized_keys
文件中。
公平地说,遗憾的是,它不像他们关于这个库的很多 最近 文档。
感谢@PoX 的帮助。
我正在学习如何使用 'phpseclib' 库。
我已成功使用 username/password 组合通过 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');
}
如您所见,我将 public 密钥格式设置为 'openssh',然后创建密钥。使用 createKey
方法创建的值,我将该键放入一个名为 'privatekey' 的文件中(没有扩展名,但不确定是否需要,因为它只是文本)。然后就正常了,加载key,作为login中的value使用。
我已经使用了官方文档(不是很好)并且 Google 到处都是,但我都没有太多运气。
getLastError
的输出是:
SSH_MSG_USERAUTH_FAILURE: publickey,password
在此先感谢您的帮助。
您的代码看起来是正确的我认为您收到此错误是因为您没有正确配置 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
您可以整天在客户端创建密钥对,但除非您生成的密钥对的 public 部分在 /home/user/.ssh/authorized_keys
文件中,否则这无关紧要。如果您正在创建密钥并尝试在同一个脚本中连接它们……它们不太可能在那个文件中。
在这种特殊情况下,您应该加载一个私钥,其对应的 public 密钥已经在 /home/user/.ssh/authorized_keys
文件中。使用 $rsa->loadKey(...)
加载它并/然后/尝试在 SSH 的登录方法中使用该 RSA 对象。
我自己想出来了。
我自己的愚蠢...
我没有将 $publickey
放入 authorized_keys
文件中。
公平地说,遗憾的是,它不像他们关于这个库的很多 最近 文档。
感谢@PoX 的帮助。