Я пытаюсь записать сценарий для генерации пар ключей Идентификационных данных 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==
Как насчет использования подпроцесса
для вызова 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==
Я не знаю такой библиотеки, которая стандартно поставляется с Python.
Если вы хотите обратиться к сторонним библиотекам, вам может пригодиться библиотека paramiko (также , доступная в PyPI ). Он реализует протокол SSH и имеет функции для обработки существующих ключей, но не для их генерации.
Генерация ключей может быть полезным дополнением к этой библиотеке (вы можете работать с разработчиками , чтобы включить ее в библиотеку Paramiko) и более легким началом, чем делать это с нуля.
Ключ, используемый 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, так что дайте мне знать, работает ли это (я должен подумать)
Просто догадываюсь ... но пробовали ли вы что-то подобное?:
print "ssh-rsa " + "".join([ l.strip() for l in open('/tmp/my.key.pub') if not l.startswith('-----')])
Можете ли вы получить из нее строку AAAA ... Dfg ==, пока это объект? Если это так, вы можете просто открыть файл самостоятельно и сохранить его вместо использования встроенной функции save_pub_key.