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

Я пытаюсь написать сценарий для генерации пар ключей SSH Identity для меня.

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== 

  • Ключи GitPython и SSH?
  • Медленная аутентификация открытого ключа с paramiko
  • Как включить закрытый ключ в paramiko после извлечения из строки?
  • 10 Solutions collect form web for “Как сгенерировать пары ключей SSH с помощью Python”

    На всякий случай, если есть какие-нибудь будущие путешественники, которые хотят это сделать. Поддержка модуля RSA теперь выдает открытый ключ в формате OpenSSH (возможно, не во время более ранних сообщений). Поэтому я думаю, что вы можете делать все, что вам нужно:

     from os import chmod from Crypto.PublicKey import RSA key = RSA.generate(2048) with open("/tmp/private.key", 'w') as content_file: chmod("/tmp/private.key", 0600) content_file.write(key.exportKey('PEM')) pubkey = key.publickey() with open("/tmp/public.key", 'w') as content_file: content_file.write(pubkey.exportKey('OpenSSH')) 

    Очевидно, что вы не храните секретный ключ в / tmp …

    Используйте cryptography ! pycrypto больше не активно развивается, и, если возможно, вы должны использовать криптографию. С июня можно также генерировать открытые ключи SSH:

     from cryptography.hazmat.primitives import serialization as crypto_serialization from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.backends import default_backend as crypto_default_backend key = rsa.generate_private_key(    backend=crypto_default_backend(),    public_exponent=65537,    key_size=2048 ) private_key = key.private_bytes(    crypto_serialization.Encoding.PEM,    crypto_serialization.PrivateFormat.PKCS8,    crypto_serialization.NoEncryption()) public_key = key.public_key().public_bytes(    crypto_serialization.Encoding.OpenSSH,    crypto_serialization.PublicFormat.OpenSSH ) 

    Примечание. Вам нужна хотя бы версия 1.4.0 .

    Редактировать 05/09/2012:

    Я просто понимаю, что у пирципто уже есть это:

     import os from Crypto.PublicKey import RSA key = RSA.generate(2048, os.urandom) print key.exportKey('OpenSSH') 

    Этот код работает для меня:

     import os from Crypto.PublicKey import RSA key = RSA.generate(2048, os.urandom) # Create public key. ssh_rsa = '00000007' + base64.b16encode('ssh-rsa') # Exponent. exponent = '%x' % (key.e, ) if len(exponent) % 2: exponent = '0' + exponent ssh_rsa += '%08x' % (len(exponent) / 2, ) ssh_rsa += exponent modulus = '%x' % (key.n, ) if len(modulus) % 2: modulus = '0' + modulus if modulus[0] in '89abcdef': modulus = '00' + modulus ssh_rsa += '%08x' % (len(modulus) / 2, ) ssh_rsa += modulus public_key = 'ssh-rsa %s' % ( base64.b64encode(base64.b16decode(ssh_rsa.upper())), ) 

    Ключ, используемый 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, поэтому, пожалуйста, дайте мне знать, если это сработает (должно быть, я думаю)

    Базовая 64-разрядная версия вывода ssh-keygen для содержимого key.pub () формата ключевого файла

     b64encode('\x00\x00\x00\x07ssh-rsa%s%s' % (key.pub()[0], key.pub()[1])) 

    Как насчет использования subprocess для вызова 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 ==
    

    Вот пример использования библиотеки Twisted Conch, которая использует PyCrypto под обложками. Документацию API можно найти по адресу http://twistedmatrix.com/documents/current/api/twisted.conch.ssh.keys.html :

     from twisted.conch.ssh import keys # one-time use key k="""-----BEGIN RSA PRIVATE KEY----- PRIVATE KEY STUFF -----END RSA PRIVATE KEY-----""" # create pycrypto RSA object rsa = keys.RSA.importKey(k) # create `twisted.conch.ssh.keys.Key` instance which has some nice helpers key = keys.Key(rsa) # pull the public part of the key and export an openssh version ssh_public = key.public().toString("openssh") print ssh_public 

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

     print "ssh-rsa " + "".join([ l.strip() for l in open('/tmp/my.key.pub') if not l.startswith('-----')]) 

    Я не знаю такой библиотеки на Python.

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

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

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

    Interesting Posts

    Объединить элементы списков, если какое-то условие

    Улучшить скорость чтения и преобразования из двоичного файла?

    Как преобразовать строку в имя переменной?

    Построение наибольшего числа возможно путем перегруппировки списка

    Python: получение правильной длины строки, когда она содержит суррогатные пары

    есть ли хороший пример использования pywin32 createprocessasuser и получения результата?

    Ошибка предварительной фиксации захвата

    Как создать цикл в Python

    python: создать блок «с» для нескольких менеджеров контекста

    SSH-туннель для соединения с Python MySQLdb

    Получить физическое местоположение карты объекта, основанного на пользовательском вводе

    HTTP Загрузить очень большой файл

    Можно ли установить еще одну версию Python в Virtualenv?

    python3.3 matplotlib не может импортировать имя _tkagg

    Как преобразовать 1D-список python, содержащий данные изображения, в массив numpy и отобразить его

    Python - лучший язык программирования в мире.