3

phpseclib またはその他の方法を使用して、秘密鍵と ftp パスワードの両方で sftp を接続する方法はありますか。

4

2 に答える 2

11

SFTP サーバーがパスワード認証と公開鍵認証の両方を使用することはまれです。私の推測では、パスワードで保護された秘密鍵を持っている可能性が最も高いと思います。その場合、次のようにログインできます。

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

$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key)) {
    exit('Login Failed');
}

print_r($sftp->nlist());
?>

実際にサーバーが本当に両方を実行している場合、次のように動作するはずです:

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

$sftp = new Net_SFTP('www.domain.tld');
$key = new Crypt_RSA();
$key->setPassword('whatever');
$key->loadKey(file_get_contents('privatekey'));
if (!$sftp->login('username', $key) && !$sftp->login('username', 'password')) {
    exit('Login Failed');
}

print_r($sftp->nlist());
?>
于 2013-04-03T19:52:21.253 に答える
2

パスワード認証を単独で試してみてください。

ログごとに何が起こっているかを次に示します。

phpseclib は SSH_MSG_SERVICE_REQUEST をサーバーに送信し、効果的に「ねえ - 私は認証したい - いいですか?」と言います。

サーバーは SSH_MSG_SERVICE_ACCEPT で応答し、効果的に「わかりました - あなたが得たものを送ってください!」と言っています。

次に、phpseclib は、秘密鍵に対応する公開鍵を含む SSH_MSG_USERAUTH_REQUEST を送信し、効果的に「わかりました - 私の秘密鍵で認証しましょう - あなたがそれを受け入れることを確認します... この公開鍵はあなたのホワイトリストにありますか?」と言います。

次に、サーバーは NET_SSH2_MSG_USERAUTH_PK_OK メッセージで応答し、効果的に「キーで問題ありません。今すぐサーバー ID に署名してください」と言います。

phpseclib がこれを行うと、サーバーは「気にしないでください! 今思い出したのですが、私が行う認証の種類はパスワード ベースの認証だけです!」のようになります。

phpseclib は "meh" (笑) になり、別の SSH_MSG_SERVICE_REQUEST を送信して、再度認証を要求すると、サーバーは「何!? なぜ認証を求めているのですか!?」のようになります。

phpseclib はおそらくその 2 番目の SSH_MSG_SERVICE_REQUEST メッセージを送信するべきではないように思われます-SSH_MSG_USERAUTH_REQUEST に直接送信する必要があります-しかし、残念ながら現在これを行っていません。コードベースを更新してそれを実行し、作成者にプル リクエストを送信します。

ありがとう!

于 2013-04-18T19:13:32.267 に答える