使用 Python 的 pysftp,如何验证主机密钥?
Using Python's pysftp, how do you verify a host key?
我正在使用 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']
当我运行上面的代码时,我得到了错误日志:
---------------------------------------------------------------------------
SSHException Traceback (most recent call last)
<ipython-input-47-205bb7b4b59b> in <module>()
5
6 srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'],
----> 7 password=DOWNLOAD['PASSWORD'])
C:\Users\Alex\Anaconda2\lib\site-packages\pysftp\__init__.pyc in __init__(self, host, username, private_key, password, port, private_key_pass, ciphers, log, cnopts, default_path)
130 # check that we have a hostkey to verify
131 if self._cnopts.hostkeys is not None:
--> 132 self._tconnect['hostkey'] = self._cnopts.get_hostkey(host)
133
134 self._sftp_live = False
C:\Users\Alex\Anaconda2\lib\site-packages\pysftp\__init__.pyc in get_hostkey(self, host)
69 kval = self.hostkeys.lookup(host) # None|{keytype: PKey}
70 if kval is None:
---> 71 raise SSHException("No hostkey for host %s found." % host)
72 # return the pkey from the dict
73 return list(kval.values())[0]
SSHException: No hostkey for host sftp.mysite.com found.
我目前可以通过执行以下操作来关闭主机密钥检查:
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'],
password=DOWNLOAD['PASSWORD'], cnopts=cnopts)
我想保留主机密钥的安全功能。任何人都可以提供有关如何生成主机密钥的 link 或在此处提供一小部分代码示例吗?我没能找到多少。
cnopts = pysftp.CnOpts()
cnopts.hostkeys.load('sftpserver.pub')
其中 sftpserver.pub
包含服务器 public 密钥,格式如下:
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
以这种格式检索主机密钥的一种简单方法是使用 OpenSSH ssh-keyscan
:
ssh-keyscan example.com
虽然为了绝对安全,您不应该远程检索主机密钥,因为您不能确定您是否已经受到攻击。
请参阅我的文章Where do I get SSH host key fingerprint to authorize the server?它是针对我的 WinSCP SFTP 客户端的,但其中的大部分信息通常都是有效的。
如果不想使用外部文件,也可以使用
cnopts.hostkeys.add(...)
有关其他选项,请参阅:Verify host key with 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']
当我运行上面的代码时,我得到了错误日志:
---------------------------------------------------------------------------
SSHException Traceback (most recent call last)
<ipython-input-47-205bb7b4b59b> in <module>()
5
6 srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'],
----> 7 password=DOWNLOAD['PASSWORD'])
C:\Users\Alex\Anaconda2\lib\site-packages\pysftp\__init__.pyc in __init__(self, host, username, private_key, password, port, private_key_pass, ciphers, log, cnopts, default_path)
130 # check that we have a hostkey to verify
131 if self._cnopts.hostkeys is not None:
--> 132 self._tconnect['hostkey'] = self._cnopts.get_hostkey(host)
133
134 self._sftp_live = False
C:\Users\Alex\Anaconda2\lib\site-packages\pysftp\__init__.pyc in get_hostkey(self, host)
69 kval = self.hostkeys.lookup(host) # None|{keytype: PKey}
70 if kval is None:
---> 71 raise SSHException("No hostkey for host %s found." % host)
72 # return the pkey from the dict
73 return list(kval.values())[0]
SSHException: No hostkey for host sftp.mysite.com found.
我目前可以通过执行以下操作来关闭主机密钥检查:
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host=FTP_SITE, username=DOWNLOAD['USERNAME'],
password=DOWNLOAD['PASSWORD'], cnopts=cnopts)
我想保留主机密钥的安全功能。任何人都可以提供有关如何生成主机密钥的 link 或在此处提供一小部分代码示例吗?我没能找到多少。
cnopts = pysftp.CnOpts()
cnopts.hostkeys.load('sftpserver.pub')
其中 sftpserver.pub
包含服务器 public 密钥,格式如下:
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
以这种格式检索主机密钥的一种简单方法是使用 OpenSSH ssh-keyscan
:
ssh-keyscan example.com
虽然为了绝对安全,您不应该远程检索主机密钥,因为您不能确定您是否已经受到攻击。
请参阅我的文章Where do I get SSH host key fingerprint to authorize the server?它是针对我的 WinSCP SFTP 客户端的,但其中的大部分信息通常都是有效的。
如果不想使用外部文件,也可以使用
cnopts.hostkeys.add(...)
有关其他选项,请参阅:Verify host key with pysftp。