pyOpenSSL creando un archivo pem

He creado un par de claves usando el siguiente código en python con pyOpenSSL:

from OpenSSL import crypto k = crypto.PKey() k.generate_key(crypto.TYPE_RSA, 2048) 
  1. Ahora, ¿cómo puedo crear los archivos .pem de clave pública y privada del objeto clave?
  2. Si hay algún tutorial disponible por favor hágamelo saber. No encontré ninguno. Del manual, es difícil saberlo porque soy nuevo en OpenSSL.
  3. ¿Cuáles son las posibilidades de que el mismo código cree dos pares de claves iguales si no hay una clave única específica que se esté utilizando en RSA?

Espero que esto ayude a la gente en el futuro, porque tenía la misma necesidad y no podía encontrar una respuesta, así que lo hice yo mismo. Pensé que lo compartiría contigo.

1. Creando un archivo PEM

 bio_pub = _new_mem_buf() # Memory buffers to write to bio_priv = _new_mem_buf() helper = OpenSSL.crypto._PassphraseHelper(OpenSSL.crypto.FILETYPE_PEM, None) pk = OpenSSL.crypto.PKey() pk.generate_key(OpenSSL.crypto.TYPE_RSA, n) # Convert from EVP_PKEY type to RSA type rsa_pkey = _lib.EVP_PKEY_get1_RSA(pk._pkey) result_code = _lib.PEM_write_bio_RSAPublicKey(bio_pub, rsa_pkey) result_code = _lib.PEM_write_bio_RSAPrivateKey( bio_priv, rsa_pkey, _ffi.NULL, _ffi.NULL, 0, helper.callback, helper.callback_args) 

Después de esta parte tendrás las claves públicas y privadas en tus buffers. Para obtenerlo como una cadena puede llamar a las funciones:

 _bio_to_string(bio_pub), _bio_to_string(bio_priv) 

Utilicé estas importaciones para las funciones especiales “privadas” de OpenSSL.crypto:

 import OpenSSL from OpenSSL._util import lib as _lib, ffi as _ffi from OpenSSL.crypto import _new_mem_buf, _bio_to_string 

Sé que esta es una pregunta antigua, pero como acabo de encontrarla, pensé que agregaría una respuesta.

La forma más fácil de hacer esto con Python 3.x es usar PyCryptodome .

El en Python (para una clave de 2048 bits):

 from Cryptodome.PublicKey import RSA key = RSA.generate(2048) pv_key_string = key.exportKey() with open ("private.pem", "w") as prv_file: print("{}".format(pv_key_string.decode()), file=prv_file) pb_key_string = key.publickey().exportKey() with open ("public.pem", "w") as pub_file: print("{}".format(pb_key_string.decode()), file=pub_file) 

Si desea verificar la clave privada en la línea de comandos (Linux) use:

 $ openssl rsa -check -inform pem -noout -in private.pem RSA key ok ... 

Puede crear una clave .pem siguiendo este tutorial en:

https://help.ubuntu.com/community/OpenSSL

eso supone que quieres crear un certificado de CA (autoridad de certificación), eso es poco complicado porque ya tienes que obtener una CA de algún lugar porque no es gratis.

Si solo desea crear una clave para su prueba de conexión ssl, es mejor crear un certificado de autofirma.

luego, asegúrese de que primero haya instalado openssl y haya resuelto el CN ​​(Nombre común) en su servidor. sin eso estarás en problemas para usar el certificado creado.

para el certificado de autofirmación use esta línea de comando:

 $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 $ openssl rsa -passin pass:x -in server.pass.key -out server.key $ rm server.pass.key $ openssl req -new -key server.key -out server.csr (list of question to answer) $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 

Una vez que haya creado el certificado, debe activar su servidor mod-ssl y agregar la línea donde se encuentra su certificado. más adelante, tendrá que insertar ese certificado en su lista de certificados de IE para que funcione con su daemon de conexión ssl de apache.