SSH2连接SFTP服务器时如何指定client-to-server MAC算法hmac-sha2-256?
解决ProFTPD SFTP服务器与PHP ssh2_connect的MAC算法不匹配问题
从你给出的日志一眼就能定位问题:客户端(你的PHP ssh2程序)和服务器(ProFTPD的mod_sftp模块)支持的MAC加密算法完全没有交集,导致SSH握手时没法协商出双方都认可的算法,连接自然失败了。下面给你一步步的解决办法:
1. 修正ssh2_connect的参数配置
你方向是对的,但踩了一个常见的小坑:ssh2_connect的算法配置需要用数组形式,而不是逗号分隔的字符串。而且要确保你指定的算法是服务器明确支持的(日志里服务器已经给出了它支持的列表:hmac-sha2-256,hmac-sha2-512,umac-64@openssh.com)。
直接用这段正确的代码试试:
$connection = ssh2_connect('my-sftp-server.com', 443, [ 'client_to_server' => [ 'mac' => ['hmac-sha2-256', 'hmac-sha2-512'] ], 'server_to_client' => [ // 顺手把服务器到客户端的MAC算法也配上,避免双向协商出问题 'mac' => ['hmac-sha2-256', 'hmac-sha2-512'] ] ]);
2. 确认你的PHP ssh2扩展支持目标算法
有些旧版本的ssh2扩展可能不支持SHA-2系列的MAC算法,你可以做个检查:
- 打开phpinfo()页面,找到
ssh2模块的信息,里面会列出支持的所有MAC算法 - 要是能临时换个支持SHA-2的客户端(比如OpenSSH命令行)连接成功后,也可以用
ssh2_algorithms($connection)打印出当前支持的算法列表(不过这个函数得在连接成功后才能用)
如果发现扩展确实不支持,建议升级libssh2库和对应的PHP ssh2扩展到最新版本。
3. 可选:调整服务器端的MAC算法(如果你有权限)
要是客户端这边没法升级或调整,你也可以修改ProFTPD的配置,让服务器兼容旧的算法。在proftpd.conf里找到SFTPMACs配置项(没有的话就新增),把客户端支持的算法加进去:
SFTPMACs hmac-sha2-256,hmac-sha2-512,umac-64@openssh.com,hmac-sha1
修改完记得重启ProFTPD服务,这样服务器就同时支持新旧算法,能兼容更多客户端了。
4. 验证是否解决问题
配置好之后再尝试连接,然后查看ProFTPD的日志,如果看到类似这样的内容,就说明算法协商成功了:
2018-04-19 12:00:00,xxx mod_sftp/0.9.9[xxxx]: negotiated client-to-server MAC algorithm: hmac-sha2-256
内容的提问来源于stack exchange,提问作者benjamin.cohen-solal
相关产品推荐
相关产品推荐

