2016-11-04 147 views
1

我使用phpseclib,我尝试使用RSA密钥登陆:登录在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类的内部,我可以看到使用_login_helper()函数登录(如果我错了,则是正确的),由login()函数调用_login()函数调用(在情况下)。

登录() - > _login() - > _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 ([email protected]_select($read, $write, $except, $sec, $usec) && !count($read)) { 

编辑2:

连接被关闭THE_SSH_SERVER_IP
11月4日23时09分58秒WEB1的sshd [10316]:没有收到identifi,我试图连接到说的一侧
的SSH登录阳离子字符串来自TH_ WEB_SERVER_IP

+0

什么更有用的是SSH日志。你可以通过在登录失败后执行'define('NET_SSH2_LOGGING',2)'',然后'echo $ ssh-> getLog()'来获得它们。代替......谁知道。也许PHP由于权限而无法读取您的私钥。也许你的私钥对应于你试图登录的用户的〜/ .ssh/authorized_keys中的公钥。 – neubert

+0

getLog()返回一个空字符串。关键是file_get_contents可读,我可以通过控制台成功使用它。事实上,如果我用这个键使用ssh2_auth_pubkey_file(),它的效果很好。如果使RSA身份验证的功能确实是_privatekey_login(),那么$ bitmask和MASK_CONNECTED的值从不让该代码获得该点。 –

回答

1

phpseclib在发送它自己的服务器标识字符串之前读取服务器标识字符串。这就是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

让我知道这是否为你的作品。让我知道你用作服务器的是什么。

+0

正如我在上面发布的,SSH服务器是“OpenSSH_4.3”。 O.S是Ubuntu 14.04。 –

+1

它工作!谢谢! 嗯!这是OpenSSH服务器的错误吗? –

+0

据我所知,这是我在Ubuntu安装期间选择的默认SSH服务器安装。 –