我有一个 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]
Run Code Online (Sandbox Code Playgroud)
我有一台运行 PHP 7.2 的服务器和一台运行 7.4 的服务器,两者都给出相同的错误,但仅在与 Ubuntu 22.04 机器对话时出现。
这是给我错误的命令:
$this->_CON = ssh2_connect($sshHost, $sshPort, [ 'hostkey' => 'ssh-dss,ssh-rsa' ]);
Run Code Online (Sandbox Code Playgroud)
这将建立连接,但当然不允许用户使用密钥:
$this->_CON = ssh2_connect($sshHost, $sshPort);
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
- - 更新 - -
好的,我刚刚将另一台服务器更新到 22.04,但 ssh2_connect 立即无法与该服务器通信。所以我确信这是 22.04 服务器的问题,而不是 php 服务器的问题。我只需要弄清楚哪个包发生了变化。也许某些配置文件导致密钥交换以不同的方式工作。
这仅通过 php ssh2_connect 进程发生。即使使用相同的密钥,也不会在命令行上直接使用 ssh 命令。
啊哈!!!!!!
我找到了解决方案。问题是“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']);
Run Code Online (Sandbox Code Playgroud)
我很高兴!
要查看 SSH 服务器的配置方式,您可以运行以下命令:
grep "HostKey" /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)
要查看密钥交换名称,您可以查看每个公钥的头部,如下所示:
head /etc/ssh/ssh_host_*.pub
Run Code Online (Sandbox Code Playgroud)
您将在开始密钥行找到密钥交换名称。
我还必须创建一些逻辑来了解我正在连接到哪些服务器。那些仍然使用 RSA 连接的用户需要使用 RSA 密钥来建立 SSH 连接。使用 ECDSA 连接的用户需要新的 ECDSA 密钥。
您可以通过运行此命令来创建新密钥,然后将其公钥附加到每台服务器上的authorized_keys中。
ssh-keygen -t ecdsa-sha2-nistp256
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8509 次 |
| 最近记录: |