在phpseclib中使用RSA密钥登录失败(超时)

时间:2016-11-04 19:00:24

标签: php ssh rsa phpseclib

我正在使用phpseclib,我正在尝试使用RSA密钥登录:

$ssh = new SSH2('<server_domain_name>');
$key = new RSA();
$key->load(file_get_contents('<private_key_path>'));
if($ssh->login('root',$key)){
    echo "Logged In!!!";
} else {
    echo "Login failed!";
}

但登录失败!查看SSH2类我可以看到使用RSA密钥登录发生在_login_helper()函数中(如果我错了,则更正),由_login()函数调用,该函数由login()函数调用(在情况下) )。

login() - &gt; _login() - &gt; _login_helper()

但这段代码:

if (!($this->bitmap & self::MASK_CONSTRUCTOR)) {
    if (!$this->_connect()) {
        return false;
    }
}
_login()函数中的

始终返回false,因此执行永远不会到达_login_helper()函数。上面部分代码返回false的原因是这些变量/常量的默认值:

var $bitmap = 0;
const MASK_CONNECTED     = 0x00000002;

我有点沮丧。我错过了什么吗?

编辑:我忘了提几秒后登录返回/失败。在_connect()方法中添加一些ECHO我可以看到该方法在等待服务器数据时超时。在执行此循环期间:

while (!feof($this->fsock) && !preg_match('#(.*)^(SSH-(\d\.\d+).*)#ms', $data, $matches))

服务器只输出一行“SSH-2.0-OpenSSH_4.3”然后(第二次循环执行)它在这里超时:

if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {

编辑2:我尝试连接的一方的SSH日志说:

连接由THE_SSH_SERVER_IP关闭 11月23日23:09:58 web1 sshd [10316]:未收到来自THE WEB_ERVER_IP的识别字符串

1 个答案:

答案 0 :(得分:2)

phpseclib在发送服务器标识字符串之前读取它。这就是PuTTY所做的。这里的证据就是我尝试连接到localhost时来自PuTTY的示例日志文件:4022:

Event Log: Writing new session log (SSH packets mode) to file: putty.log
Event Log: Looking up host "127.0.0.1"
Event Log: Connecting to 127.0.0.1 port 4022
Event Log: Server version: SSH-2.0-OpenSSH_6.6p1 Ubuntu-2ubuntu1
Event Log: Using SSH protocol version 2
Event Log: We claim version: SSH-2.0-PuTTY_Release_0.63

以下是SSH规范的说法:

   When the connection has been established, both sides MUST send an
   identification string.  This identification string MUST be

      SSH-protoversion-softwareversion SP comments CR LF

来源:https://tools.ietf.org/html/rfc4253#section-4.2

请注意,它并不表示一方必须在另一方之前发送。双方都应该有可立即检索的内容。如果您的SSH服务器只是在客户端发送了它的标识字符串之后才有条件地使内容可供检索,那么您的SSH服务器就会出错。让我知道您使用的服务器我将打开一个错误报告。

与此同时,phpseclib的修改版本首先发送标识字符串,而不是首先读取它:

https://github.com/terrafrost/phpseclib/tree/send-identifier-first

如果这对你有用,请告诉我。让我知道您作为服务器使用的是什么。