【问题标题】:phpseclib connection closed by server?服务器关闭了phpseclib连接?
【发布时间】:2018-12-09 04:36:21
【问题描述】:

我有一个非常简单的 PHP 脚本,它尝试从 CENTOS 7 机器连接到 SFTP 服务器。通过 composer 使用 phpseclib。

<?php
require('vendor/autoload.php');
$usr = 'xx';
$pwd = 'xx';
$host = 'sftp.domain.com.au';

$sftp = new SFTP($host);

if($sftp->login($usr, $pwd)){
   echo "Connected.";
}else {
   echo "Failed";
}
?>

甚至使用了 RSA 密钥

<?php
require('vendor/autoload.php');
$usr = 'xx';
$pwd = 'xx';
$host = 'sftp.domain.com.au';

$sftp = new SFTP($host);
$rsa  = new RSA();
$rsa->loadKey(file_get_contents("../../.ssh/id_rsa"));
if($sftp->login($usr, $pwd, $rsa)){
   echo "Connected.";
}else {
   echo "Failed";
}
?>

上面使用 RSA 的脚本实际上确实工作了几次并让我建立了联系。所以我想我需要了解它为什么起作用,并改变一些事情。我尝试生成另一个覆盖现有密钥的密钥。但这一次它不再起作用了。

我还打开了 NET_SFTP_LOGGING,没有显示错误,只是一个简单的“连接被服务器关闭”。我已经为此工作了好几天..

我唯一能想到的是,当我重新生成密钥并以某种方式覆盖 ID_RSA 时,服务器可能认为它不再是正确的密钥了吗?

当我使用 WinSCP 连接时,似乎 FTP 服务器给了我一个算法: ssh-rsa 4096 、 sha256 和 md5 代码。这是我需要在我的 PHP 脚本中使用才能正确连接的东西吗?只是想排除任何可能性。

更多详情:

  • 在工作中我可以通过 FILEZILLA/WINSCP 连接到 FTP 服务器
  • CENTOS box 服务器是我们工作网络的一部分。
  • 我无法从家里连接到 FTP 服务器。
  • 在 CENTOS 机器上,我启用配置“ssh_config”并使用 ssh-kegen -t RSA 生成密钥,我什至将 id_rsa.pub 添加到了 authorized_keys

请任何人给我们一些建议,因为这会消耗我几天,希望不会几周!提前致谢。

【问题讨论】:

    标签: php ftp sftp phpseclib


    【解决方案1】:

    来自您的代码:

    $rsa->loadKey("../../.ssh/id_rsa");
    

    试试这个:

    $rsa->loadKey(file_get_contents("../../.ssh/id_rsa"));
    

    还有,

    if($sftp->login($usr, $pwd, $rsa)){
    

    真的想要使用多因素身份验证吗?以我的经验,设置 SSH 服务器的情况很少见。似乎更有可能的是,您有一个受密码保护的 RSA 私钥,此时您会做更多这样的事情:

    $rsa->setPassword($pwd);
    $rsa->loadKey(file_get_contents("../../.ssh/id_rsa"));
    

    【讨论】:

    • 感谢您的参与。是的,我只是忘记在帖子中包含 file_get_content。但是,当您执行 setPassword 时,您的第二个建议是指我生成的 rsa 私钥还是远程服务器 rsa 密钥?我一直认为它是为了释义?
    • @Chopnut - 就 SSH 客户端而言,远程服务器 rsa 密钥始终是公钥。我从未听说过有密码关联的 RSA 公钥格式,也没有必要,因为公众应该是 public。所以,是的,我指的是您生成的 rsa 私钥。回复:“我一直认为它是为了释义?”。 $rsa-&gt;setPassowrd($pwd); 设置密钥以解密 RSA 私钥(如果已加密)。 idk 如果您的私钥是否已加密,但根据我的经验,加密的私钥比多因素身份验证服务器更常见..
    • 嗯,这行得通。这就是我所做的。我使用 FTP 服务器的密码重新生成了我的私钥,然后使用 $ftp->login($user,$pwd,$rsa) 提供登录信息。现在我的问题是,为什么它有效?这次我做的唯一区别是使用 FTP 密码作为新密钥的密码。这就是我打算用 ftp 密码生成我的密钥的方式吗?谢谢neubert。
    • @Chopnut - 首先,让我们验证您正在使用的身份验证方法。如果您可以在文件顶部执行define('NET_SSH2_LOGGING', 2);,然后在您登录后执行echo $ssh-&gt;getLog();,如果您可以在pastebin.com 链接中发布日志输出,然后在此处发布该链接,那就太好了。这将告诉我们是否需要 RSA 密钥。我有点想知道是否不需要。如果您执行 $sftp->login('username', 'rightpw', 'wrongpw')` 并且未使用多因素身份验证,那么您可以毫无问题地登录。 'wrongpw'` 将被忽略并且永远不会提交给服务器。
    • 抱歉回复晚了。坏消息,当我回来摆弄代码并在几天后再次刷新页面时。突然它不再工作了。我几乎尝试做上次做的事情,但这一次,只是不想玩得很好。你认为正在发生什么?这可能是他们的 FTP 服务器问题吗?我发誓它在我离开之前有效并测试了几次。现在只是变得如此沮丧..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2017-03-31
    • 1970-01-01
    • 2020-09-28
    • 2013-12-11
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多