繁体   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