php 7.4,ssh_connect(),仅当连接到 ubuntu 22.04 机器时才出现“无法交换加密密钥”

php 7.4,ssh_connect(),仅当连接到 ubuntu 22.04 机器时才出现“无法交换加密密钥”

我有一个 PHP 工具,需要通过 SSH 访问我的一些服务器。这是一个仅供内部使用的应用程序,在与 Ubuntu 18.04 机器通信时,它可以 100% 正常工作。

我开始将我的机器更新到 22.04,当我尝试使用 PHP 和 ssh2_connect() 打开 SSH 连接时,22.04 上的每台机器都会出现错误消息“无法交换加密密钥”。

当我在 CLI 中并尝试访问时,我可以使用安全密钥和用户进行 SSH,就像 Web 服务器启动 ssh 一样。

sudo -u www-data ssh -i [path-to-private-key] [user]@[ip-address]

我有一台运行 PHP 7.2 的服务器和一台运行 7.4 的服务器,两者都出现相同的错误,但仅在与 Ubuntu 22.04 机器通信时出现。

这是给我错误的命令:

$this->_CON = ssh2_connect($sshHost, $sshPort, [ 'hostkey' => 'ssh-dss,ssh-rsa' ]);

这将建立连接但当然不会允许用户使用密钥:

$this->_CON = ssh2_connect($sshHost, $sshPort);

有什么想法吗?

- - 更新 - -

好的,我刚刚将另一台服务器更新到 22.04,但 ssh2_connect 立即无法与该服务器通信。因此,我确信这是 22.04 服务器的问题,而不是 php 服务器的问题。我只需要找出哪个包发生了变化。也许某些配置文件导致密钥交换工作方式不同。

这只会在 php ssh2_connect 进程中发生。即使使用相同的密钥,直接在命令行中使用 ssh 命令也不会发生这种情况。

答案1

啊哈!!!!!!

我找到了解决方案。问题是“ssh-rsa”的密钥交换过程在 Ubuntu 22.04 系统上不被接受。我改用“ecdsa-sha2-nistp256”,它成功了!

此代码现在可以在 PHP 7.2、7.4 和 8.1(已在所有三个服务器上测试)以及 Ubuntu 18.04、20.04 和 22.04 服务器(再次在所有服务器上测试)上运行

$con = ssh2_connect($hostAddr, $hostPort , [ 'hostkey' => 'ecdsa-sha2-nistp256,ssh-rsa']);

我很高兴!

要查看 SSH 服务器的配置方式,可以运行以下命令:

grep "HostKey" /etc/ssh/sshd_config

要查看密钥交换名称,您可以像这样查看每个公钥的头部:

head /etc/ssh/ssh_host_*.pub

您将在开始密钥行上找到密钥交换名称。

我还必须创建一些逻辑来了解我正在连接到哪些服务器。那些仍在使用 RSA 连接的人需要使用 RSA 密钥来建立 SSH 连接。那些使用 ECDSA 连接的人需要新的 ECDSA 密钥。

您可以通过运行此命令来创建新密钥,然后将公钥附加到每台服务器上的authorized_keys。

ssh-keygen -t ecdsa-sha2-nistp256

答案2

将这些行添加到/etc/ssh/sshd_config

HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa

并重新启动sshd

sudo systemctl restart sshd

相关内容