You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用本地公钥通过PHP实现服务器间SSH登录及问题排查

解决PHP ssh2_connect验证服务器身份失败问题

问题排查与修复步骤

1. 修复函数调用的参数错误

你的代码在调用connect函数时参数顺序完全错误,把未初始化的$connection传到了$ssh_server_fp的位置,这会直接导致指纹验证失败。正确的调用应该严格按照函数定义的参数顺序传入:

$connection = connect($ssh_host, $ssh_port, $ssh_server_fp, $ssh_auth_user, $ssh_auth_pub, $ssh_auth_priv, $ssh_auth_pass);

2. 获取正确的vServer服务器指纹

$ssh_server_fp需要填写vServer的SSH服务器对应算法的十六进制指纹,获取方法如下:

  • 在共享服务器的终端执行命令,获取vServer的ECDSA密钥MD5指纹(与你代码中指纹算法匹配):
    ssh-keyscan -t ecdsa [vServer_ip] | ssh-keygen -lf - -E md5
    
    输出结果类似2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx [vServer_ip] (ECDSA),把输出里的xx:xx:...部分去掉冒号,就是你需要填入$ssh_server_fp的字符串。

3. 修正密钥相关的配置细节

  • 注释里的$ssh_auth_pass是私钥的加密密码,不是公钥的,你注释描述错误,要确保填入的是私钥对应的密码(无密码则填null)。
  • 确保共享服务器上的密钥文件及目录权限正确,否则会导致公钥认证失败:
    chmod 700 /usr/www/users/[my_username]/.ssh
    chmod 600 /usr/www/users/[my_username]/.ssh/profile1
    chmod 644 /usr/www/users/[my_username]/.ssh/profile1.pub
    

4. 可选:切换指纹算法(若MD5验证仍失败)

如果MD5指纹验证持续失败,可以尝试改用SHA256指纹:

  • 修改代码中ssh2_fingerprint的参数:
    $fingerprint = ssh2_fingerprint($connection, SSH2_FINGERPRINT_SHA256 | SSH2_FINGERPRINT_HEX);
    
  • 对应获取SHA256指纹的命令:
    ssh-keyscan -t ecdsa [vServer_ip] | ssh-keygen -lf - -E sha256
    
    提取去掉冒号的指纹值填入$ssh_server_fp即可。

修正后的完整代码

$ssh_host = '[vServer_ip]';
// SSH Port
$ssh_port = 22;
// SSH Server Fingerprint(替换为你获取的正确指纹)
$ssh_server_fp = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// SSH Username
$ssh_auth_user = '[vServer_username]';
// SSH Public Key File
$ssh_auth_pub = '/usr/www/users/[my_username]/.ssh/profile1.pub';
// SSH Key File
$ssh_auth_priv = '/usr/www/users/[my_username]/.ssh/profile1';
// SSH 私钥密码(无密码填null)
$ssh_auth_pass = '[your_private_key_passphrase]';

function connect($ssh_host, $ssh_port, $ssh_server_fp, $ssh_auth_user, $ssh_auth_pub, $ssh_auth_priv, $ssh_auth_pass) {
    if (!($connection = ssh2_connect($ssh_host, $ssh_port))) {
        throw new Exception('无法连接到服务器');
    }
    // 可根据需要切换为SSH2_FINGERPRINT_SHA256
    $fingerprint = ssh2_fingerprint($connection, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
    if (strcmp($ssh_server_fp, $fingerprint) !== 0) {
        throw new Exception('无法验证服务器身份!');
    }
    if (!ssh2_auth_pubkey_file($connection, $ssh_auth_user, $ssh_auth_pub, $ssh_auth_priv, $ssh_auth_pass)) {
        throw new Exception('服务器拒绝认证');
    }
    return $connection;
}

// 修正参数顺序后的函数调用
$connection = connect($ssh_host, $ssh_port, $ssh_server_fp, $ssh_auth_user, $ssh_auth_pub, $ssh_auth_priv, $ssh_auth_pass);
var_dump($connection);

内容的提问来源于stack exchange,提问作者Insomnia88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:05:28