Verify host key with pysftp

前端 未结 9 862
北海茫月
北海茫月 2020-11-22 08:33

I am writing a program using pysftp, and it wants to verify the SSH host Key against C:\\Users\\JohnCalvin\\.ssh\\known_hosts.

Using PuTTY, the terminal

9条回答
  •  隐瞒了意图╮
    2020-11-22 08:48

    Do not set cnopts.hostkeys = None (as the second most upvoted answer shows), unless you do not care about security. You lose a protection against Man-in-the-middle attacks by doing so.


    Use CnOpts.hostkeys (returns HostKeys) to manage trusted host keys.

    cnopts = pysftp.CnOpts(knownhosts='known_hosts')
    
    with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
    

    where the known_hosts contains a server public key[s] in a format like:

    example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
    

    If you do not want to use an external file, you can also use

    from base64 import decodebytes
    # ...
    
    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
    key = paramiko.RSAKey(data=decodebytes(keydata))
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys.add('example.com', 'ssh-rsa', key)
    
    with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:
    

    Though as of pysftp 0.2.9, this approach will issue a warning, what seems like a bug:
    "Failed to load HostKeys" warning while connecting to SFTP server with pysftp


    An easy way to retrieve the host key in this format is using OpenSSH ssh-keyscan:

    $ ssh-keyscan example.com
    # example.com SSH-2.0-OpenSSH_5.3
    example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB...
    

    (due to a bug in pysftp, this does not work, if the server uses non-standard port – the entry starts with [example.com]:port + beware of redirecting ssh-keyscan to a file in PowerShell)

    You can also make the application do the same automatically:
    Use Paramiko AutoAddPolicy with pysftp
    (It will automatically add host keys of new hosts to known_hosts, but for known host keys, it will not accept a changed key)


    Though for an absolute security, you should not retrieve the host key remotely, as you cannot be sure, if you are not being attacked already.

    See my article Where do I get SSH host key fingerprint to authorize the server?
    It's for my WinSCP SFTP client, but most information there is valid in general.


    If you need to verify the host key using its fingerprint only, see Python - pysftp / paramiko - Verify host key using its fingerprint.

提交回复
热议问题