3

无论如何使用 phpseclib 或任何其他方法将 sftp 与私钥和 ftp 密码连接起来。

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 消息响应,有效地说,“是的 - 我们可以使用密钥 - 请现在用它签署服务器标识符”。

phpseclib 这样做,然后服务器就像“没关系!我只是记得 - 我做的唯一类型的身份验证是基于密码的身份验证!”

phpseclib 去“meh”大声笑,然后发送另一个 SSH_MSG_SERVICE_REQUEST,再次请求身份验证,服务器就像“什么!?你为什么要求身份验证!?”

似乎 phpseclib 可能不应该发送第二个 SSH_MSG_SERVICE_REQUEST 消息 - 它应该直接发送到 SSH_MSG_USERAUTH_REQUEST - 但可惜它目前没有这样做。我将尝试更新代码库来做到这一点,并将向作者提交拉取请求。

谢谢!

于 2013-04-18T19:13:32.267 回答