2

ドキュメントでこれを見逃していたら申し訳ありませんが、秘密鍵とパスワード (私の秘密鍵のパスフレーズではありません) を使用して SFTP サーバーに接続することは可能ですか?

例は、ユーザー名/パスワード、ユーザー名/キー、およびユーザー名/キー/キー パスフレーズの認証タイプを示しています。

コマンドライン経由で接続すると、パスワードを求めるこのプロンプトが表示されます...

user@xxxx のパスワード:

うまくいけば、このライブラリはこれを処理できますか?

それ以外の場合、ユーザー名/キーおよびサーバー パスワード認証をサポートする可能性のある他の PHP ベースのソリューションはありますか? ここでは非常に柔軟で、必要に応じてモジュールをインストールできます。

編集

これまで助けてくれてありがとう...あなたがNeubertについて言及したことを試しましたが、これはうまくいかなかったようです. サーバーへの接続に必要なものを確認するために、コマンドラインでこれをテストしました。
sftp key user@ip- 予想どおりパスワードの入力を求められました- パスワードの入力を
sftp user@ip求められましたが、正しく入力すると、「部分的な成功で認証されました」と言われました。

キーとパスワードを使用してアクセスできる場合、ディレクトリとキーのアクセス許可は問題ないと思います。

このライブラリは必要なものをサポートしていないと思い始めています。

4

5 に答える 5

3

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 に関する限りではありません。

于 2012-12-10T21:17:36.020 に答える
2

@MartinPrikryl による免責事項: phpseclib が多要素認証をネイティブにサポートするようになったため、このソリューションは廃止されました。@BoukeVersteeghおよび@neubertによる回答も参照してください。


phpseclib を使用しているプロジェクトの 1 つで、同じ問題に遭遇しました。私はいくつかの提案を試してみましたが、うまくいかず、最終的に自分でライブラリ コードを調査しました。大したことではありませんが、最終的に変更しました。

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 クラスの両方) を変更して、2 番目のパスワードを取得し、それを '_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;
}

コードの別の部分からキーボードの対話型呼び出しをコピーしたので、その一部は完全には必要ないかもしれません。すべてのサーバーに当てはまるわけではありませんが、私の場合はうまく機能しました。

于 2013-02-06T22:08:43.423 に答える
1

短い簡単な答え: 最初に 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
}

はい、これは既に述べましたが、長いメモではわかりにくく、複雑に見えます。

于 2016-11-23T12:58:30.190 に答える
0

私が間違っていたことが判明したため、他の回答を削除することにしました。標準的な方法ではなく、SSH を使用して多要素ログインを行うことができます。これらの認証方法はいずれも、openssh にネイティブまたは組み込みではないため、標準的な方法はありません。ほとんどの場合、Google Authenticator を使用してワンタイム パスワードを提供しますが、違いがあります。このサイトの推奨事項によると、ユーザーがSSHサーバーによって認証された後にコマンドを呼び出すことによって行われるようです。メソッドのphpseclibソース コードを見ると、次のコードがあります。Net/SSH2.phplogin()

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 の開発者でさえ、多要素認証が可能であることは認識していましたが、標準が不足していたため、わざわざコーディングすることはありませんでした。エラーコードをグーグルで調べる

部分的な成功で認証されました

これは、接続しようとしているサーバーがどのようにセットアップされているかを示しています。サーバーのセットアップに固有の多要素認証をコーディングしたい場合、それが不可能な理由がわかりません。これは、それを行うために編集する必要があるファイルです。

于 2012-12-11T19:18:42.123 に答える
-2

PECL で SSH2 バインディングを使用できます。あなたが言及したすべての認証メカニズムをサポートしており、非常にうまく機能します。

于 2012-12-10T18:17:41.157 に答える