2017-04-07 82 views
1

我正在使用Python 2.7 pysftp软件包连接到SFTP服务器。使用python的pysftp,你如何验证主机密钥?

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) 

我想保留主机密钥的安全功能。任何人都可以提供关于如何生成主机密钥的链接,或者在这里提供一小段代码示例?我一直无法找到很多。

+0

主机密钥服务器,而不是客户端生成。客户端只是下载并接受/拒绝他们。 – jordanm

+0

你知道如何从sftp服务器请求一个hostkey吗? –

回答

3
cnopts = pysftp.CnOpts() 
cnopts.hostkeys.load('sftpserver.pub') 

其中sftpserver.pub包含类似的格式的服务器的公钥:

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(...) 
+0

我从主机收到的文件是一个公钥。由于主机密钥应该是私密的,因此这不起作用。我无法使用主机私钥,因为这是一个安全问题。我应该如何将公钥转换为私钥? –

+0

你完全困惑。首先明白,你实际上想要做什么。您需要验证服务器主机密钥。为此,您需要服务器(=主机)公钥和我的答案中的代码。您无法获得服务器(主机)私钥。这是秘密。或者您想使用密钥对进行身份验证。为此,您需要生成公钥+私钥对。你似乎不知道你在做什么。请参阅[了解SSH密钥对](https://winscp.net/eng/docs/ssh_keys)。 –