无法交换加密密钥

Unable to exchange encryption keys

我现在遇到了一个难题,我在网上找不到任何可以帮助我的东西。

我想通过 SSH 从我的服务器连接到另一台服务器以发送指令(第二台服务器管理 Wi-Fi 授权)。

据我所知,我认为问题的发生是因为我们更新了一台服务器。 (我不太确定问题是否因此而出现)。

我来自 Windows 服务器,我想调用 Linux 服务器。

这是脚本:

function executeCommand($command) {
    $infoConnection = getInfoConnection();

    $out = '';
    //The Warning occurs here, impossible to go further
    $connection = ssh2_connect($infoConnection["hostname"], 22);

    if ($connection === false) {
        $error = error_get_last();
        throw new Exception("
        Error Type : ".$error["type"]."<br/>
        Message : ".$error["message"]."<br/>
        File : ".$error["file"]."<br/>
        Line : ".$error["line"]."<br/>");
    }

    ssh2_auth_password($connection, $infoConnection["username"], $infoConnection["password"]);

    $stdio_stream = ssh2_shell($connection);
    sleep(2);
    fwrite($stdio_stream,$infoConnection["username"]."\n");
    sleep(1);
    fwrite($stdio_stream,$infoConnection["password"]."\n");
    sleep(1);

    fwrite($stdio_stream, $command."\n");
    sleep(1);
    while($buffer = fgets($stdio_stream)) {

        $out .= $buffer;
    }
    fwrite($stdio_stream, 'exit');
    unset($connection);

    return $out;
}

这是警告:

Warning: ssh2_connect() [function.ssh2-connect]: Error starting up SSH connection(-5): Unable to exchange encryption keys in ../aff_wifi.php on line 203

第 203 行是这一行:

$connection = ssh2_connect($infoConnection["hostname"], 22);

当我 "catch" 警告时,我有这个:

Error type : 2 Message : ssh2_connect() [function.ssh2-connect]: Unable to connect to ipAdress File: ..\aff_wifi.php Line: 203

你知道为什么会这样吗? 当我尝试使用 PuTTY 从我的服务器连接到另一台服务器时,一切正常

祝你有个愉快的一天!

Warning: ssh2_connect() [function.ssh2-connect]: Error starting up SSH connection(-5): Unable to exchange encryption keys in ../aff_wifi.php on line 203

libssh2 0.x 仅支持基于 Diffie-Hellman SHA1 的密钥交换。 OpenSSH 默认禁用 DH SHA1。这让 libssh2 0.x 又高又干。

选项 1:更新 libssh2

libssh2 1.7 及以上版本支持 DH SHA256 和 ECDH 密钥交换。这些将与最新的 OpenSSH 一起工作。 1.x 版本需要 PHP 7.

选项 2:使用 phpseclib

如果您卡在 PHP 5,则 libssh2 不可用。 PHP5 可用的最高版本是 libssh2 0.13,它仍然只支持 SHA1 密钥交换。另一个对我有用的库是 phpseclib。它支持 diffie-hellman-group-exchange-sha256,我能够连接到更新的 OpenSSH 服务器。

我在尝试通过 ssh2_connect 从一个有点老的 xenial 访问焦点 ubuntu 服务器时遇到了这个问题。解决方案是更新 libssh2-1。即使 php 显示旧版本,它也能正常工作。

在 xenial 中,我添加了焦点存储库,然后安装了最新版本的 libssh2-1,重新启动PHP 以应用并删除了焦点存储库。

sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse"
sudo apt-get update
sudo apt -y install libssh2-1
sudo add-apt-repository -r "deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse"
sudo apt-get update

如果您有权访问 SSH 服务器,并且 SSH 服务器是 Linux 系统上的 运行,则 /var/log/messages/var/log/secure Linux 系统上的日志可能包含有助于确定返回“无法交换加密密钥”原因的事件。例如,/var/log/secure 日志可能有这样的内容。

Jan 29 07:02:46 docker1 sshd[3245780]: Unable to negotiate with 192.168.0.15 port 55736: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]

请注意,在此示例中,/var/log/secure 日志将“未找到匹配的主机密钥类型”捕获为根本问题。默认情况下,PHP ssh2_connection 函数提供以下主机密钥类型。

  • ssh-rsa
  • ssh-dss

如果 SSH 服务器不接受 ssh-rsa 或 ssh-dss 作为主机密钥类型,那么 /var/log/secure 日志将捕获类似“未找到匹配的主机密钥类型”和 PHP 应该记录“无法交换加密密钥”。在这种情况下,需要更新 SSH 服务器以接受 ssh-rsa 或 ssh-dss 主机密钥类型。

例如,如果 SSH 服务器是 OpenSSH,这可能意味着将 ssh-rsa 和 ssh-dss 附加到 /etc/crypto-policies/back-ends/opensshserver.config[= 中的 HostKeyAlgorithms 行25=] 在 OpenSSH Linux 系统上。