Как генерировать пары ключей SSH с Python

Я пытаюсь записать сценарий для генерации пар ключей Идентификационных данных SSH для меня.

from M2Crypto import RSA
key = RSA.gen_key(1024, 65337)
key.save_key("/tmp/my.key", cipher=None)

Файл /tmp/my.key взгляды, большие теперь.

Путем выполнения ssh-keygen -y -f /tmp/my.key > /tmp/my.key.pub Я могу извлечь открытый ключ.

Мой вопрос состоит в том, как я могу извлечь открытый ключ из Python? Используя key.save_pub_key("/tmp/my.key.pub") сохраняет что-то как:

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADASDASDASDASDBarYRsmMazM1hd7a+u3QeMP
...
FZQ7Ic+BmmeWHvvVP4Yjyu1t6vAut7mKkaDeKbT3yiGVUgAEUaWMXqECAwEAAQ==
-----END PUBLIC KEY-----

Когда я ищу что-то как:

ssh-rsa AAAABCASDDBM$%3WEAv/3%$F ..... OSDFKJSL43$%^DFg==
33
задан Lee 17 March 2010 в 22:35
поделиться

5 ответов

Как насчет использования подпроцесса для вызова ssh-keygen ?

from subprocess import Popen, PIPE
import shlex

def get_pub_key(path):
    args = shlex.split('ssh-keygen -y -f')
    args.append(path)
    p = Popen(args, stdout=PIPE)
    stdout = p.communicate()[0]
    if p.returncode != 0:
        raise Exception("Error handling would be nice, eh?")
    return stdout.strip()

print get_pub_key('/tmp/my.key')

Приведенная выше небольшая программа создаст вывод такой:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA ... 9Jbn6D74JOKpaOU050ltyNRw==
1
ответ дан 18 November 2019 в 04:45
поделиться

Я не знаю такой библиотеки, которая стандартно поставляется с Python.

Если вы хотите обратиться к сторонним библиотекам, вам может пригодиться библиотека paramiko (также , доступная в PyPI ). Он реализует протокол SSH и имеет функции для обработки существующих ключей, но не для их генерации.

Генерация ключей может быть полезным дополнением к этой библиотеке (вы можете работать с разработчиками , чтобы включить ее в библиотеку Paramiko) и более легким началом, чем делать это с нуля.

0
ответ дан 27 November 2019 в 17:43
поделиться

Ключ, используемый ssh, просто закодирован в base64, я не очень хорошо разбираюсь в M2Crypto, но после беглого обзора кажется, что вы можете делать то, что хотите, следующим образом:

import os
from base64 import b64encode
from M2Crypto import RSA            

key = RSA.gen_key(1024, 65537)
raw_key = key.pub()[1]
b64key = b64encode(raw_key)

username = os.getlogin()
hostname = os.uname()[1]
keystring = 'ssh-rsa %s %s@%s' % (b64key, username, hostname)

with open(os.getenv('HOME')+'/.ssh/id_rsa.pub') as keyfile:
    keyfile.write(keystring)

Я не тестировал сгенерированный ключ с помощью SSH, так что дайте мне знать, работает ли это (я должен подумать)

4
ответ дан 27 November 2019 в 17:43
поделиться

Просто догадываюсь ... но пробовали ли вы что-то подобное?:

print "ssh-rsa " + "".join([ l.strip() for l in open('/tmp/my.key.pub') if not l.startswith('-----')])
0
ответ дан 27 November 2019 в 17:43
поделиться

Можете ли вы получить из нее строку AAAA ... Dfg ==, пока это объект? Если это так, вы можете просто открыть файл самостоятельно и сохранить его вместо использования встроенной функции save_pub_key.

0
ответ дан 27 November 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: