如何在PHP Curl中指定KexAlgorithms与Ciphers实现SFTP连接
如何在PHP Curl中指定SFTP的KexAlgorithms和Ciphers?
问题背景
在CentOS终端执行以下SFTP命令可成功连接服务器:
sftp -o KexAlgorithms=diffie-hellman-group1-sha1 -o Ciphers=aes256-cbc USER_NAME@IP_ADDRESS
但使用PHP Curl实现时,仅配置了CURLOPT_SSL_CIPHER_LIST:
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ECDHE-ECDSA-AES128-SHA');
返回错误:
Failure establishing ssh session
解决方案
PHP Curl中用于SFTP的SSH相关算法配置和HTTPS的SSL cipher是不同的,需要使用专门的SSH选项:
- 指定密钥交换算法:使用
CURLOPT_SSH_KEX_ALGS对应终端的KexAlgorithms - 指定加密算法:使用
CURLOPT_SSH_CIPHERS对应终端的Ciphers
正确的完整示例代码:
// 初始化SFTP连接的Curl会话 $ch = curl_init('sftp://USER_NAME@IP_ADDRESS'); // 设置密钥交换算法,与终端命令一致 curl_setopt($ch, CURLOPT_SSH_KEX_ALGS, 'diffie-hellman-group1-sha1'); // 设置加密算法,与终端命令一致 curl_setopt($ch, CURLOPT_SSH_CIPHERS, 'aes256-cbc'); // 配置认证信息(密码或密钥二选一) // 密码认证 curl_setopt($ch, CURLOPT_USERPWD, 'USER_NAME:YOUR_PASSWORD'); // 密钥认证(如果需要) // curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, '/path/to/private_key'); // 配置返回结果而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行连接并处理结果 $result = curl_exec($ch); if ($result === false) { echo '连接失败: ' . curl_error($ch); } else { echo 'SFTP连接成功'; } // 关闭Curl会话 curl_close($ch);
注意事项
- 需确保PHP的Curl扩展版本对应Curl 7.73.0及以上,因为
CURLOPT_SSH_KEX_ALGS和CURLOPT_SSH_CIPHERS是该版本后新增的选项。 - 不要混淆
CURLOPT_SSL_CIPHER_LIST,该选项仅用于HTTPS协议的SSL加密套件,和SFTP的SSH加密无关。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

