phpseclib sftp使用私钥和密码连接

时间:2013-04-03 19:49:17

标签: key sftp phpseclib

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

2 个答案:

答案 0 :(得分:7)

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());
?>

答案 1 :(得分:2)

我会说只是尝试密码验证。

以下是每个日志发生的事情。

phpseclib向服务器发送SSH_MSG_SERVICE_REQUEST,有效地说“嘿 - 我想认证 - 那好吗?”

服务器以SSH_MSG_SERVICE_ACCEPT响应,有效地说“确定 - 发给我你的东西!”

然后phpseclib发送一个SSH_MSG_USERAUTH_REQUEST,其中包含与您的私钥对应的公钥,实际上是说“确定 - 让我用我的私钥验证 - 确保您接受它......这是您的白名单中的公钥?“

服务器然后用一条NET_SSH2_MSG_USERAUTH_PK_OK消息回复,有效地说,“是的 - 我们对密钥没问题 - 请立即用它签署服务器标识符”。

phpseclib做到这一点,然后服务器就像“没关系!我记得 - 我唯一的auth类型是基于密码的auth!”

phpseclib去了“meh”大声笑然后发送另一个SSH_MSG_SERVICE_REQUEST,再次要求auth,服务器就像“什么!?为什么要求授权!”

似乎phpseclib可能不应该发送第二条SSH_MSG_SERVICE_REQUEST消息 - 它应该直接发送到SSH_MSG_USERAUTH_REQUEST - 但是它目前没有这样做。我将尝试更新代码库以执行此操作并向作者提交拉取请求。

谢谢!