2016-11-04 78 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服務器安裝。 –