如何在phpseclib密钥登录失败时进行故障排除?

时间:2014-08-08 16:03:15

标签: phpseclib

我一直在尝试使用phpseclib来运行与各种云服务器的简单SSH会话。每次使用密钥登录。

使用没有密码保护的密钥的测试很好:我在标准端口22上尝试了一个,然后在非标准端口上尝试了另一个,并且两者都有效。 (两者都在Amazon EC2,不同地区。)

但我尝试的第一次测试失败了,其中包括:

SSH_MSG_USERAUTH_FAILURE: publickey,password

它有一个受密码保护的密钥,带有非标准端口。这是我的脚本(更改名称以保护无辜者):

include('Net/SSH2.php');
include('Crypt/RSA.php');

$ssh = new Net_SSH2('10.1.2.3', /*port*/999);
$key = new Crypt_RSA();

$key->setPassword('secrets');
$ret = $key->loadKey(file_get_contents('/home/tester/.ssh/my_private_key'));
if(!$ret){
    echo "loadKey failed\n";
    exit;
    }

if (!$ssh->login('ubuntu', $key)) {
    print_r($ssh->errors);
    exit("Login Failed\n");
    }

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

我做了ssh-agent -d /home/tester/.ssh/my_private_key(强制它提示我),然后在命令行上使用了ssh,它运行了。如果我跳过设置密码,loadKey()将返回false。

所以,现在我想知道是否不支持密钥类型? "坏"钥匙开头是这样的:

-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A541E5B6B9077483BCEF845

YMMV4.....

而"好"键以:

开头
-----BEGIN RSA PRIVATE KEY-----
YMMVgIBab54...

我找到了this question,其中Proc-Type和DEK-Info似乎很好,但他的是RSA,而不是DSA。那么DSA问题呢? (但如果是这样的话,当我试图loadKey()时,phpseclib是否应该投诉?)

有关如何获取有关此问题的更多信息的任何建议? (不在这里发布实际的密钥!)

2 个答案:

答案 0 :(得分:3)

要回答我的问题的“如何解决问题”部分,您可以在创建define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);对象之前添加Net_SSH2。然后在退出之前执行file_put_contents("ssh.log",$ssh->getLog());(或echo $ssh->getLog())。这会记录发送到远程服务器的每个字节以及收到的每个字节。 (完整修改后的脚本如下所示。)

不幸的是,当只支持RSA时,您必须是域专家才能将此问题识别为使用DSA密钥。但是,对于其他问题,这种故障排除方法可能正是您所需要的。

include('Net/SSH2.php');
include('Crypt/RSA.php');

define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
$ssh = new Net_SSH2('10.1.2.3', /*port*/999);
$key = new Crypt_RSA();

$key->setPassword('secrets');
$ret = $key->loadKey(file_get_contents('/home/tester/.ssh/my_private_key'));
if(!$ret){
    echo "loadKey failed\n";
    file_put_contents("ssh.log",$ssh->getLog());
    exit;
    }

if (!$ssh->login('ubuntu', $key)) {
    print_r($ssh->errors);
    file_put_contents("ssh.log",$ssh->getLog());
    exit("Login Failed\n");
    }

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
file_put_contents("ssh.log",$ssh->getLog());

答案 1 :(得分:1)

-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A541E5B6B9077483BCEF845

YMMV4.....

这是DSA密钥。 phpseclib目前仅支持RSA密钥。即使它确实支持DSA密钥,您也可能需要加载一个尚未编写的Crypt_DSA - 而不是Crypt_RSA lol