使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”

Posted

技术标签:

【中文标题】使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”【英文标题】:"No hostkey for host ***** found" when connecting to SFTP server with pysftp using private key 【发布时间】:2019-05-20 17:08:54 【问题描述】:

所以我在通过 SFTP 连接到远程服务器时遇到了很多问题。我已经尝试了如下的正常方式。

sftp = pysftp.Connection(host='Host',username='username',password='passwd',private_key=".ppk")

这不起作用。我收到以下错误:

SSHException: No hostkey for host ***** found.

然后我尝试了以下方法:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
s = pysftp.Connection(host='host', username='user', password='password', cnopts=cnopts)

这也不起作用。我收到以下错误:

BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])

当我运行以下命令时:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("host",username = "username",password = "password")
ssh_session = client.get_transport().open_session()

我得到同样的错误:

BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])

【问题讨论】:

【参考方案1】:

您混淆了用于身份验证的私钥和用于验证服务器身份的主机密钥。两者都需要处理,而您的所有代码尝试只处理其中一个。请参阅SSH key pairs 上的我的文章,了解 SSH 中涉及的两种密钥之间的区别。

所以这应该“有效”:

# Accept any host key (still wrong see below)
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
# And authenticate with a private key
sftp = pysftp.Connection(
    host='Host', username='user', password='passwd', private_key=".ppk",
    cnopts=cnopts)

但是这段代码实际上会盲目地接受任何主机密钥(cnopts.hostkeys = None),这是一个安全漏洞。有关正确方法,请参阅Verify host key with pysftp。

【讨论】:

【参考方案2】:

您正在连接的host 似乎不可用。当由于防火墙规则(或主机上的拼写错误)而无法访问主机名时,通常会发生这种情况。 我建议首先检查您是否可以从(unix)终端进行 sftp

> sftp username@host

如果系统提示您输入密码或登录,您可以从该机器连接到该主机

如果不尝试在端口 22 上使用 netcat 检查该主机是否可用,如果主机不可用,您将得到超时或管道损坏

>nc -v host 22

我建议仅在此之后调试 pysftpparamiko 包。

此外,如果您使用私钥进行身份验证,则不需要使用密码。

【讨论】:

以上是关于使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”的主要内容,如果未能解决你的问题,请参考以下文章

使用 pysftp 连接到 SFTP 服务器时出现“加载主机密钥失败”警告

AWS Glue 可以通过 SFTP 连接到远程服务器吗?

使用 pysftp 执行 sftp 但出现主机密钥错误

使用 SSH 公钥/私钥连接到 sFTP 服务器。错误 Invalid private key file. 使用 SSH.NET

gaierror: [Errno -2] 名称或服务未知| pysftp

使用pysftp通过跳转服务器连接