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

Laravel使用privatekey.pem/ppk连接SFTP服务器失败求助

排查Laravel/phpseclib SFTP密钥登录失败问题

针对你遇到的问题,结合你的环境(Laravel 8、PHP 7、league/flysystem-sftp 1.1、phpseclib 2.0),可以按以下步骤逐一排查:

1. 确认密钥文件的完整性与格式兼容性

你贴出的privatekey.pem内容明显是截断状态,首先要确保密钥文件完整无缺失。另外phpseclib 2.0对OpenSSH新格式密钥的支持有限,建议重新转换密钥:

  • 打开PuttyGen加载你的privatekey.ppk文件
  • 点击Conversions → Export OpenSSH key,选择**旧格式(OpenSSH (old format))**导出为新的privatekey.pem
  • 确保新导出的密钥和你终端正常使用的完全一致

2. 调整phpseclib的密钥加载逻辑

尝试显式指定密钥格式,若密钥有密码需补充密码参数:

use phpseclib\Crypt\RSA;
use phpseclib\Net\SFTP;

$key = new RSA();
// 密钥有密码则替换为实际密码,无密码则设为null
$passphrase = null; 
$key->loadKey(file_get_contents('C:/key/privatekey.pem'), $passphrase);
// 显式设置加密模式适配OpenSSH格式
$key->setEncryptionMode(RSA::ENCRYPTION_OPENSSH);

$sftp = new SFTP('XX.XX.XX.XX');
// 服务器端口非默认22时,添加端口参数:new SFTP('XX.XX.XX.XX', 2222)

if (!$sftp->login('XXXXX', $key)) {
    // 打印完整日志定位具体错误(比如密钥被拒绝、KEX算法不兼容等)
    dd(implode("\n", $sftp->getLog()));
}

3. 修正Laravel文件系统配置

避免直接读取密钥内容,改为填写文件路径,减少编码或换行符导致的问题:

'sftp' => [
    'driver' => 'sftp',
    'host' => 'XX.XX.XX.XX',
    'username' => 'XXXX',
    'privateKey' => 'C:/key/privatekey.pem', // 直接填写密钥文件路径
    'root' => '/upload',
    // 服务器端口非默认22时添加
    // 'port' => 2222,
    // 密钥有密码时添加
    // 'passphrase' => 'your_passphrase',
]

4. 检查PHP环境依赖与权限

  • 确认PHP的openssl扩展已启用(通过phpinfo()查看)
  • 用realpath('C:/key/privatekey.pem')验证密钥文件路径正确,且PHP进程有权限读取该文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:20:13