¿Cómo convertir una clave privada en una clave privada RSA?

97

Permítanme explicar mi pregunta primero. Compré un certificado de una CA y utilicé el siguiente formato para generar el csr y la clave privada:

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

Cuando abro el archivo server.key, veo que comienza con "----- BEGIN PRIVATE KEY -----"

Utilizo el certificado SSL en mi servidor y todo se ve bien.

Ahora quiero cargar el mismo certificado en AWS IAM para poder usarlo con el balanceador de carga de beanstalk. Utilizo el siguiente comando de este documento de aws http://docs.aws.amazon.com/IAM/latest/UserGuide/InstallCert.html#SubmitCSRCertAuth

iam-servercertupload -b public_key_certificate_file  -k privatekey.pem -s certificate_object_name

Cambio los nombres de los archivos del certificado según sea necesario, pero sigo recibiendo este error: "400 MalformedCertificate Invalid Private Key"

Lo interesante es que, en la página del documento de aws, la clave privada de muestra que muestran comienza con "------- Comenzar clave privada RSA --------"

¿Hay alguna forma de convertir mi clave privada en una clave privada RSA usando openssl?

Usuario silencioso
fuente

Respuestas:

155

Las versiones más nuevas de OpenSSL dicen que BEGIN PRIVATE KEYporque contienen la clave privada + un OID que identifica el tipo de clave (esto se conoce como formato PKCS8). Para obtener la clave de estilo antiguo (conocida como PKCS1 o formato tradicional OpenSSL) puede hacer esto:

openssl rsa -in server.key -out server_new.key

Alternativamente, si tiene una clave PKCS1 y quiere PKCS8:

openssl pkcs8 -topk8 -nocrypt -in privkey.pem
Paul Kehrer
fuente
1
Esta es también la solución para recibir mensajes de error extraños como Invalid PEM structure, '-----BEGIN...' missing.de herramientas como Cyberduck mientras SSH puro con la misma clave está funcionando.
Daniel
1
¡Gracias! ¡Estaba obteniendo A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.y ejecutando esto en mi clave privada y lo arreglé!
philfreo
4
Para referencia: consulte stackoverflow.com/q/20065304/53974 para obtener una explicación más completa.
Blaisorblade
1
¿Cómo hacemos lo opuesto a esto? Necesito un Private Keyde un RSA Private Key?
edthethird
1
openssl pkcs8 -topk8 -nocrypt -in privkey.pemescribirá un PKCS8 a STDOUT
Paul Kehrer
24

Esto puede ser de alguna ayuda (no escriba literalmente las barras invertidas '\' en los comandos, están destinadas a indicar que "todo tiene que estar en una línea"):

Qué comando aplicar cuando

Parece que todos los comandos (en gris) toman cualquier tipo de archivo de clave (en verde) como argumento "en". Lo cual es bueno.

Aquí están los comandos nuevamente para copiar y pegar más fácilmente:

openssl rsa                                                -in $FF -out $TF
openssl rsa -aes256                                        -in $FF -out $TF
openssl pkcs8 -topk8 -nocrypt                              -in $FF -out $TF
openssl pkcs8 -topk8 -v2 aes-256-cbc -v2prf hmacWithSHA256 -in $FF -out $TF

y

openssl rsa -check -in $FF
openssl rsa -text  -in $FF
David Tonhofer
fuente
1
El archivo "graphml" de la imagen (que se puede editar con yworks yed, por ejemplo) se puede encontrar aquí
David Tonhofer
8

Para convertir "BEGIN OPENSSH PRIVATE KEY" en "BEGIN RSA PRIVATE KEY"

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
ahirapara
fuente
Esto es exactamente lo que necesitaba. ¡Gracias!
RossD
Este comportamiento se documenta indirectamente en la página de manual de ssh-keygen, pero el uso del indicador -m en realidad no se menciona para otros modos de operación que no sean -i y -o
ikrabbe