簡體   English   中英

phpseclib-我可以使用用戶名,密鑰和密碼(而不是密鑰密碼)進行連接

[英]phpseclib - Can I connect using username, key and password (not a key passphrase)

抱歉,如果我在文檔中錯過了此功能,但是可以使用私鑰和密碼(而不是我的私鑰密碼)連接到SFTP服務器。

這些示例顯示了用戶名/密碼,用戶名/密鑰和用戶名/密鑰/密鑰密碼驗證類型。

通過命令行連接時,系統會提示我輸入密碼...

user @ xxxx的密碼:

希望這個圖書館能處理這個嗎?

否則,是否還有其他基於PHP的解決方案可能支持用戶名/密鑰和服務器密碼身份驗證? 我在這里非常靈活,可以根據需要安裝模塊。

編輯

感謝到目前為止的幫助...我已經嘗試過您提到的諾伊伯特,但這似乎沒有用。 為了驗證連接到服務器的必要條件,我在命令行上對此進行了測試。
sftp key user@ip提示輸入密碼
sftp user@ip提示輸入密碼,但輸入正確時會告訴我“部分成功通過身份驗證”。

我認為,如果我可以先使用密鑰再使用密碼,則對目錄和密鑰的許可應該很好。

我開始認為該庫不支持我所需要的。

phpseclib 支持多因素身份驗證 這是一個如何做的例子:

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

$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents('/path/to/key.pem'));

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'pass1', $rsa)) {
    exit('Login failed');
}
// this does the same thing as the above
//if (!$ssh->login($username, 'pass1') && !$ssh->login('username', $rsa)) {
//    exit('Login failed');
//}

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

但是要記住一點:很多人將受密碼保護的私鑰混淆為多因素(密碼和公鑰),而實際上卻並非如此。 至少就SSH而言並非如此。

@MartinPrikryl的免責聲明:此解決方案已過時,因為phpseclib原生支持多因素身份驗證 -另請參閱@BoukeVersteegh@neubert答案


我在使用phpseclib的項目中遇到了相同的問題。 我嘗試了一些建議都無濟於事,最后我自己對庫代碼進行了一些研究。 我最終修改了它,盡管不是很多。

在SSH2.php私有方法“ _privatekey_login”(有密鑰時從登錄方法調用)中,該方法的末尾有用於處理身份驗證失敗的代碼。

extract(unpack('Ctype', $this->_string_shift($response, 1)));

switch ($type) {
   case NET_SSH2_MSG_USERAUTH_FAILURE:
      // either the login is bad or the server employs multi-factor authentication
      return false;
   case NET_SSH2_MSG_USERAUTH_SUCCESS:
      $this->bitmap |= NET_SSH2_MASK_LOGIN;
      return true;
}

輸入一些日志后,我發現我從服務器返回的響應確實是“ password,keyboard-interactive”。

我修改了所有登錄方法(在SFTP和SSH2類中)以獲取第二個密碼,並將其一直傳遞給'_privatekey_login'方法。 然后,我將以上部分更改為以下內容:

extract(unpack('Ctype', $this->_string_shift($response, 1)));

switch ($type) {
   case NET_SSH2_MSG_USERAUTH_FAILURE:
      // Possible multi-factor authentication.
      if ($password && $this->_keyboard_interactive_login($username, $password)) {
         $this->bitmap |= NET_SSH2_MASK_LOGIN;
         return true;
      }
      // the login is bad.
      return false;
   case NET_SSH2_MSG_USERAUTH_SUCCESS:
      $this->bitmap |= NET_SSH2_MASK_LOGIN;
      return true;
}

我從代碼的另一部分復制了鍵盤交互式調用,因此其中某些可能不是完全必要的。 盡管它可能不適用於所有服務器,但在我看來,它的工作效果很好。

簡單簡短的答案:首先使用user + key登錄,然后使用user + pass登錄。

$host = 'ftp.example.com';
$username = 'username';
$password = 'secret';
$key = new RSA();
$key->load(file_get_contents('~/.ssh/private_key.pem'));

$sftp = new SFTP($host);

if ($sftp->login($username, $key) || $sftp->login($username, $secret)) {
    // success
} else {
    // failed
}

是的,已經提到過這一點,但是長長的注釋使它變得晦澀難懂,看起來很復雜。

我決定刪除其他答案,因為事實證明我錯了。 可以使用SSH進行多因素登錄,只是這不是一種標准方式。 這些身份驗證方法都不是opensh的本機或內置方法,因此沒有標准的解決方法。 大多數使用Google身份驗證器提供一次性密碼,但是有所不同。 根據本網站的建議,看起來是通過在SSH服務器對用戶進行身份驗證之后調用命令來完成的。 login()方法中login() Net/SSH2.php中的phpseclib源代碼,它具有以下代碼:

case NET_SSH2_MSG_USERAUTH_FAILURE:
    // can we use keyboard-interactive authentication?  if not then either the login is bad or the server employees
    // multi-factor authentication
    [...]
    return false;

甚至phpseclib開發人員也意識到可以進行多因素身份驗證,但是由於缺乏標准,他們沒有費心對其進行編碼。 搜尋您的錯誤代碼

通過部分成功認證

顯示這是您嘗試連接的服務器的設置方式。 如果您想編寫特定於服務器設置的多因素身份驗證代碼,我不知道為什么無法實現。 這是您需要編輯才能執行的文件。

您可以在PECL中使用SSH2綁定 它支持您提到的所有身份驗證機制,並且運行良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM