Ubuntu20.04下PHP ssh2_connect用ECDSA密钥时HOSTKEY方法覆盖失败求解
解决PHP ssh2扩展无法使用ECDSA主机密钥的问题
问题核心
Ubuntu 20.04官方源的libssh2版本为1.8.0,而ECDSA主机密钥支持需要1.9.0及以上版本,因此需要手动编译升级libssh2并重新编译PHP ssh2扩展。
具体操作步骤
1. 清理旧版本依赖
先卸载系统自带的libssh2和php-ssh2包,避免编译冲突:
apt purge -y libssh2-1 libssh2-1-dev php-ssh2 apt autoremove -y
2. 编译安装新版libssh2
以当前稳定版1.11.0为例,先安装编译依赖:
apt install -y build-essential libssl-dev wget
下载源码并编译安装:
wget https://www.libssh2.org/download/libssh2-1.11.0.tar.gz tar zxf libssh2-1.11.0.tar.gz cd libssh2-1.11.0 ./configure --prefix=/usr/local/libssh2 --with-openssl make && make install
3. 重新编译PHP ssh2扩展
让pecl编译时链接新安装的libssh2:
pecl uninstall ssh2 export PKG_CONFIG_PATH=/usr/local/libssh2/lib/pkgconfig pecl install ssh2-1.3.1
安装完成后,确保php.ini中已启用扩展(若未配置则添加):
extension=ssh2.so
4. 验证与测试
重启PHP服务后,验证libssh2版本:
php -r "echo ssh2_version();"
输出应为你编译的版本(如1.11.0)。此时测试ECDSA主机密钥连接:
$connection = ssh2_connect('目标服务器地址', 22, [ 'hostkey' => 'ecdsa-sha2-nistp256' ]); var_dump($connection);
额外处理(若PHP找不到libssh2)
如果出现库找不到的错误,添加系统库搜索路径:
echo "/usr/local/libssh2/lib" > /etc/ld.so.conf.d/libssh2.conf ldconfig
Docker环境优化建议
将上述步骤写入Dockerfile,构建镜像时自动完成编译安装,示例片段:
RUN apt purge -y libssh2-1 libssh2-1-dev php-ssh2 && apt autoremove -y RUN apt install -y build-essential libssl-dev wget RUN wget https://www.libssh2.org/download/libssh2-1.11.0.tar.gz && \ tar zxf libssh2-1.11.0.tar.gz && \ cd libssh2-1.11.0 && \ ./configure --prefix=/usr/local/libssh2 --with-openssl && \ make && make install RUN pecl uninstall ssh2 && \ export PKG_CONFIG_PATH=/usr/local/libssh2/lib/pkgconfig && \ pecl install ssh2-1.3.1 RUN echo "extension=ssh2.so" >> /etc/php/7.4/cli/php.ini && \ echo "extension=ssh2.so" >> /etc/php/7.4/fpm/php.ini RUN echo "/usr/local/libssh2/lib" > /etc/ld.so.conf.d/libssh2.conf && ldconfig
内容的提问来源于stack exchange,提问作者bobbybobbobbed
相关产品推荐
相关产品推荐

