使用Python的pysftp,如何验证主机密钥?

Ale*_*x F 2 python ssh sftp pysftp

我正在使用Python 2.7 pysftp程序包连接到SFTP服务器。

import pysftp

DOWNLOAD = {
"USERNAME": "username",
"PASSWORD": "password"
}

FTP_SITE = 'sftp.mysite.com'

srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'], 
                    password=DOWNLOAD['PASSWORD']
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我得到了错误日志:

import pysftp

DOWNLOAD = {
"USERNAME": "username",
"PASSWORD": "password"
}

FTP_SITE = 'sftp.mysite.com'

srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'], 
                    password=DOWNLOAD['PASSWORD']
Run Code Online (Sandbox Code Playgroud)

我目前正在通过执行以下操作来关闭对主机密钥的检查:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None 
srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'], 
                         password=DOWNLOAD['PASSWORD'], cnopts=cnopts)
Run Code Online (Sandbox Code Playgroud)

我想保留主机密钥的安全性功能。谁能提供有关如何生成主机密钥的链接,或者在此处提供一小段代码示例?我没找到太多。

Mar*_*ryl 5

cnopts = pysftp.CnOpts()
cnopts.hostkeys.load('sftpserver.pub')
Run Code Online (Sandbox Code Playgroud)

其中sftpserver.pub包含服务器公钥,格式如下:

cnopts = pysftp.CnOpts()
cnopts.hostkeys.load('sftpserver.pub')
Run Code Online (Sandbox Code Playgroud)

以这种格式检索主机密钥的一种简单方法是使用OpenSSH ssh-keyscan

example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
Run Code Online (Sandbox Code Playgroud)

尽管出于绝对安全性考虑,但是如果您尚未受到攻击,则不能确定是否应该远程检索主机密钥。

请参阅我的文章如何获得SSH主机密钥指纹来授权服务器?它用于我的WinSCP SFTP客户端,但是那里的大多数信息通常都是有效的。


如果您不想使用外部文件,也可以使用

cnopts.hostkeys.add(...)
Run Code Online (Sandbox Code Playgroud)

有关其他选项,请参阅:使用pysftp验证主机密钥