Как настроить файл hostkey, используя s sh -ed25519 в качестве ключа для pysftp - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь подключиться к сайту SFTP в моем скрипте Python, используя pysftp.

Так как у меня нет файла hostkey, я создал его как предложено здесь , "hostkey", и я пытаюсь загрузить этот файл, но pysftp не не подключаться к сайту sftp.

Код python очень прост:

cnopts = pysftp.CnOpts()
cnopts.hostkeys.load(pathToTheFile)
with pysftp.Connection(host, username=username, private_key=pathToPKey, cnopts=cnopts) as sftp:
    #do things

Сначала я попытался добавить в файл hostkey следующее:

host.com ssh-ed25519 256 AZFsh0........Qy0=

Но это приводит к InvalidHostKey ошибка с ошибкой Incorrect padding. Я предполагаю, что это не требует 256 для ключа. Итак, я удалил 256.

Когда я пытаюсь без 256:

host.com ssh-ed25519 256 AZFsh0........Qy0=

Затем он распознает ключ, но появляется ошибка 'utf-8' codec can't decode byte 0x90 in position 11: invalid start byte.

Итак, вместо загрузки файла hostkey, я попытался добавить хост-ключ со следующими кодами, как предложено в здесь :

keydata = b"""AZFsh0........Qy0="""
key1 = paramiko.ed25519key.Ed25519Key(data=keydata)
key2 = paramiko.ed25519key.Ed25519Key(data=base64.b64decode(keydata))
key3 = paramiko.ed25519key.Ed25519Key(data=base64.b64decode(keydata).hex())
key4 = paramiko.ed25519key.Ed25519Key(data=decodebytes(keydata))
key5 = paramiko.ed25519key.Ed25519Key(data=decodebytes(keydata).hex())
cnopts.hostkeys.add("host.com", "ssh-ed25519", key1) 

Я пытался со всеми вышеупомянутые ключи, но я все еще получаю ошибки как Incorrect padding,

Я вижу, что кто-то упомянул, что это может быть ошибка , но сообщение от 2018. Кто-нибудь знает, если это не так выполнимо или я что-то упустил?

РЕДАКТИРОВАТЬ (Это сработало)

Решение опубликовано в Подключение к SFTP-серверу с использованием pysftp и Python 3 только с отпечатком пальца сервера , который был указан в ссылке в ответе Martin Prikryl .

Это то, что я использовал (я убрал некоторые, чтобы удалить неиспользуемые функции).

import hashlib as hl

#Removed trim_fingerprint() and clean_fingerprint() because it wasn't necessary in my case
class FingerprintKey:
    def __init__(self, fingerprint):
        self.fingerprint = fingerprint
    def compare(self, other):
        if callable(getattr(other, "get_fingerprint", None)):
            return other.get_fingerprint() == self.fingerprint
        elif other == self.get_fingerprint():
            return True
        elif hl.md5(other).hexdigest() == self.fingerprint:
            return True
        else:
            return False
    def __cmp__(self, other):
        return self.compare(other)
    def __contains__(self, other):
        return self.compare(other)
    def __eq__(self, other):
        return self.compare(other)
    def __ne__(self, other):
        return not self.compare(other)
    def get_fingerprint(self):
        return self.fingerprint
    def get_name(self):
        return u'ssh-ed25519' # Including "256" errors out. 
    def asbytes(self):
        return self

И это было использовано следующим образом:

cnopts = pysftp.CnOpts()
cnopts.hostkeys.add('host.com', u'ssh-ed25519 256', FingerprintKey("e2d1............c957")) # Removed ":" from the MD5 value

Главное, с чем я боролся, было то, что я не был уверен, какое значение следует включить для cnopts.hostkeys.add, et c, поэтому я добавлю эти подробности на случай, если есть люди, которые плохо знакомы с этим.

В моем случае я использовал WinSCP, чтобы получить отпечаток ключа хоста.

  1. Открыть WinSCP
  2. Введите имя хоста, имя пользователя и укажите путь к закрытому ключу для подключения
  3. Нажмите Сеанс
  4. Нажмите Сервер / Информация протокола
  5. Использовать значение в алгоритме для второго параметра (keytype) cnopts.hostkeys.add
  6. Использовать значение в MD5 для третьего параметра (key) cnopts.hostkeys.add. Фактическое значение дано для двоеточий (например, e2: d1: ...... c9: 57), но как автор Подключение к SFTP-серверу с использованием pysftp и Python 3 только с отпечатком пальца сервера упомянуто, я должен был также удалить толстые кишки вручную.

1 Ответ

0 голосов
/ 30 января 2020

Что относится к «файлу ключа хоста» - это полный ключ хоста / publi c, а не только отпечаток пальца.

Подробнее см. (Снова):
Проверка ключа хоста с помощью pysftp

Если вы хотите проверить ключ хоста, используя только его отпечаток пальца, см .:
Python - pysftp / paramiko - Проверить ключ хоста с помощью его отпечаток пальца
(хотя это уже связано с первым ответом).

...