phpseclib没有提供兼容的服务器或客户端加密算法

时间:2016-03-07 12:09:36

标签: ssh include-path phpseclib

大家好我很感激这个问题已经被问到Notice: No compatible server to client encryption algorithms found in但提供的建议和答案并没有解决我的问题,也没有以任何方式深入探讨这个问题,并解释了'stream_resolve_include_path()'工作,重新启动apache没有解决我的问题,也没有我尝试过的包含路径说明。

我相信我的问题与路径有关(可能包括路径或者可能是由于我的目录结构,但我不确定如何修复。

我正在尝试通过phpseclib连接到远程服务器,当我将文件包含在文档根目录的子目录中时,它可以正常工作,但我在根目录中运行的脚本会在我的问题中引发错误。

phpseclib从根运行,因此我有一个目录结构如下:

docroot(调用脚本的文件失败)

  • classes(这是我成功完成调用的文件夹)
  • Crypt(文件夹phpseclib有加密算法)
  • 文件(phpseclib文件夹)
  • 数学(phpseclib文件夹)
  • Net(phpseclib的ssh2文件所在的位置)
  • 服务(phpseclib文件夹)

我的工作文件的简化版本如下:

<?php
set_include_path( '..' . DIRECTORY_SEPARATOR);

include_once ('Net/SSH2.php');
public function updatessh($sshId, $sshAddress, $sshUserName, $sshPassword, $port = 22) {
    $ssh = new Net_SSH2($sshAddress, $port);
    if (!ssh->login($sshUserName, $sshPassword)) {
        // Login failed
        ... code for failure
    } else {
        // Login success
        ... code for success
    }

这很好用,我通过ssh登录并可以处理请求。

docroot中我的非工作代码片段几乎完全相同,如下所示:

<?php
set_include_path(DIRECTORY_SEPARATOR);

include_once ('Net/SSH2.php');
public function updatessh($sshId, $sshAddress, $sshUserName, $sshPassword, $port = 22) {
    $ssh = new Net_SSH2($sshAddress, $port);
    if (!ssh->login($sshUserName, $sshPassword)) {
        // Login failed
        ... code for failure
    } else {
        // Login success
        ... code for success
    }

传递给这些函数的所有参数都是正确的,并且多次尝试解决此问题。

我尝试了与工作示例相同的包含路径,附加$ _SERVER ['DOCUMENT_ROOt']不起作用,并且没有包含失败。

我很茫然,必须在这里丢失一些东西,包含它之后的文件然后调用它自己的包含来获取Crypt文件夹的权利,肯定会是相同的没有?

phpseclib的版本是0.3.something,我也尝试使用版本1(它使用命名空间但完全没有成功,因为这有点工作恢复到这个项目的非命名空间版本。

任何指针都将不胜感激。

5 个答案:

答案 0 :(得分:2)

包括以下顶部为我工作: set_include_path(getcwd());

答案 1 :(得分:0)

  

通过set_include_path(DIRECTORY_SEPARATOR);

这是胡说八道。您已经说过phpseclib代码和代码都位于文档根目录中。我将假设文档根是文件系统中的子目录,例如&#39;在/ var / www / html等&#39;而不是&#39; /&#39;,但后者正是您指定的phpseclib文件的位置。

如果将上面的行更改为:

set_include_path('.' . DIRECTORY_SEPARATOR);

它应该导致与您说的脚本相同的行为,但这不是一个好的解决方案。

  • 您的代码与phpseclib
  • 之间没有明确的区别
  • 您违反了系统上配置的默认包含路径

首先需要决定是否将phpseclib视为应用程序的嵌入式部分或应用程序所在平台的一部分。对于前者,您应该在项目目录中有一个包含phpseclib dirs的目录。在第二种情况下,phpseclib应该与您的项目一起位于单个目录中。

理想情况下,您应该在文档根目录之外保留尽可能多的代码以减少攻击面。在您想要构建易于部署的可移植应用程序的情况下,嵌入库使这变得不可能 - PHP没有任何方法来指示应该将代码部署到何处。但是,上述方法允许使用一致的模型来管理(和重新使用)系统上的第三方组件。

将组件放在其他位置意味着您可以使用静态包含路径包含文件。嵌入组件意味着您需要动态确定包含路径。如果您沿着嵌入式根目录运行,那么建立一个基准目录(通常是项目的基本目录),您可以从中找到所需的任何其他资源。

最后,不要替换脚本中的include路径 - 添加它。请注意,向路径添加条目的顺序是显着的(从左到右搜索列表),例如。

$ipath=ini_get('include_path');
switch (DIRECTORY_SEPERATOR) {
   case '/':
      set_include_path(PROJECT_BASE . "/include" 
              . (strlen($ipath) ? ":$ipath" : ""));
      break;
   case '\\':
       set_include_path(PROJECT_BASE . "/include"
              . (strlen($ipath) ? ";$ipath" : ""));
       break;
   default:
       trigger_error("Unable to resolve system semantics", E_USER_ERROR);
       exit -1;
}
include_once ('phpseclib/Net/SSH2.php');

答案 2 :(得分:0)

我找到的一个解决方案是:

  

这很好用,取决于你的设置,我必须添加   set_include_path(get_include_path() . PATH_SEPARATOR . APPPATH . 'third_party/phpseclib');如其文档中所示,因为   Net / SSH2.php做了一些自己没有的工作   phpseclib在路上。

How to load phpseclib in codeigniter

答案 3 :(得分:0)

有时此错误会引发文件范围的bcoz。 将您的业务逻辑代码(php文件)放在Project_Name / phpseclib文件夹中,然后尝试。

答案 4 :(得分:0)

之所以要继续前面的答案,是因为使用如下代码加载了加密算法:

if (class_exists('\phpseclib\Crypt\Rijndael') === false) {
        $encryption_algorithms = array_diff(
            $encryption_algorithms,
            array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc')
        );
}

因此,如果您的代码以非标准方式加载phpseclib,则不会加载包含算法的类,则SSH2对象将假定它没有加密算法,并且会收到错误消息。

您可能会发现可以根据需要直接加载算法,例如:

require 'vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php';