Найти - Пользователи
Полная версия: Генерация RSA ключей
Начало » Python для новичков » Генерация RSA ключей
1
morfair
Мне нужно генерировать пары rsa-ключей (открыйтый/закрытый), чтобы использоваться их в технологии DKIM (электронная почта).

Из консоли это советуют делать так:
openssl genrsa -out /etc/exim4/dkim/exmple.ru.key 1024
openssl rsa -in /etc/exim4/dkim/exmple.ru.key -out /etc/exim4/dkim/exmple.ru_pub.key -pubout

Это работае. Но т.к. мне нужно сие делать автоматически (в Django) и раздавать пользователям, писал свое решение. Сначала сделал так: http://eth0.pro/post/9, вроде как все красиво, мой второй пчотовый сервер всё успешно свалидировал, но ни один другой открытый ключ не принимает, тест с сайта port25.com выдает ошибку, что не может прочитать ключ. Попробовал по закрытому ключу, что сгенерировал по статье http://eth0.pro/post/9, сделать открытый при помощи openssl (из консоли) - открытый ключ получился другой, нежели в библиотке import rsa.
Решил попробовать другой библиотекой. Нашел pyOpenSSL, но там я так и не понял как получить открытый ключ.

def generate_rsa_key_pair(bits=1024):
	import OpenSSL
	private_key = OpenSSL.crypto.PKey()
	private_key.generate_key(OpenSSL.crypto.TYPE_RSA, bits)
	
	# Закрытый (приватный) ключ в текстовом виде:
	private_key_text = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, private_key)
	# Вывести ключ как текст:
	#print private_key_text
	
	cert = OpenSSL.crypto.X509()
	cert.set_pubkey(private_key)
	
	# Вывести сертификат как текст
	#print OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
	
	public_key = cert.get_pubkey()
	public_key.generate_key(OpenSSL.crypto.TYPE_RSA, bits)
	
	# ... а чо дальше то?....

Т.е. здесь я приватный ключ получил, могу его принтануть, но как получить открытый - не понимаю…

Подскажите нормальны способ генерации пары rsa-ключей, которые бы понимали все системы!!!
s0rg
m2crypto:
from os import urandom
from M2Crypto import RSA, BIO, Rand, util
def rsa_gen_keys(bits=1024):
    '''
    @param: bits - Key length, in bits
    @return: Tuple of (secret, public) new RSA keys in PEM format
    '''
    Rand.rand_seed(urandom(1024))
    keys = RSA.gen_key(bits, 65537, util.quiet_genparam_callback)
    sec_key = BIO.MemoryBuffer()
    keys.save_key_bio(sec_key, None)
    pub_key = BIO.MemoryBuffer()
    keys.save_pub_key_bio(pub_key)
    return (sec_key.read(), pub_key.read())
P.S. Поправил импорты
morfair
s0rg
Спасибо!!!! Как только поменял на Вашу функцию, сразу все заработало, получил заветные dkim=pass! Не знаю почему вариант с http://eth0.pro/post/9 не работал…

P.S.: Про urandom я догадался, спасибо)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB