更换Debian10虚拟机后pysftp连接服务器报Bad host key错误如何解决
问题原因
Debian 10内置的OpenSSH 8.x版本默认禁用了基于SHA-1哈希的ssh-rsa主机密钥算法,服务端默认优先返回ssh-ed25519、ecdsa-sha2-nistp256等安全性更高的主机密钥。你原有代码中固定配置的是ssh-rsa类型的主机公钥校验规则,和服务端实际返回的密钥类型不匹配,因此触发SSHException: Bad host key from server报错。
解决方案
方案1(推荐):适配Debian 10默认的密钥类型
- 登录目标Debian 10服务器,执行命令
ssh-keyscan -t ed25519 你的服务器地址,获取输出内容中ssh-ed25519后的公钥字符串,替换原有环境变量中存储的RSA公钥值 - 修改代码中的密钥加载逻辑,匹配ed25519密钥类型,修改后完整代码如下:
from base64 import decodebytes import os import pysftp import paramiko host = os.getenv('host') username = os.getenv('username') password = os.getenv('password') # 加载ed25519类型主机公钥 keydata = bytes(os.getenv('key'),'UTF-8') key = paramiko.Ed25519Key(data=decodebytes(keydata)) cnopts = pysftp.CnOpts() # 主机密钥类型同步修改为ssh-ed25519 cnopts.hostkeys.add(host,'ssh-ed25519', key) with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts, port=22) as sftp: sftp.cwd('/home/user/') for attr in sftp.listdir(): print(attr)
如果服务器默认返回的是ecdsa类型密钥,对应把密钥类型换成ecdsa-sha2-nistp256、加载类换成paramiko.ECDSAKey即可。
方案2(不推荐):在服务端重新开启ssh-rsa支持
如果需要兼容原有RSA密钥配置,可以手动修改Debian 10的SSH服务配置放开ssh-rsa算法限制:
- 登录服务器编辑配置文件
/etc/ssh/sshd_config,新增配置行:HostKeyAlgorithms +ssh-rsa - 执行命令
systemctl restart sshd重启SSH服务生效,原有代码无需修改即可正常连接。
注意:严禁为了省事直接设置
cnopts.hostkeys = None跳过主机密钥校验,该配置会完全禁用服务端身份验证,存在严重的中间人攻击风险,生产环境禁止使用。
内容的提问来源于stack exchange,提问作者GRAN
相关产品推荐
相关产品推荐

