09 septiembre, 2017

OpenSSL - Convertir certificados digitales: .PFX .CSR .PEM .CRT o .CER y extraer la clave privada de certificados

En Windows Server cuando se genera un certificado autofirmado por el propio servidor este se puede exportar por defecto en formato .pfx. Los certificados en formato .pfx contienen tanto la clave pública como la privada.

Tipos de formatos más frecuentes de certificados

  • .CSR (Certificate Signing Request): Sería el archivo generado normalmente por el servidor que usará el certificado SSL. El CSR contiene información relativa a la organización.
  • .KEY: Es el archivo de clave de privada para cifrar las solicitudes.
  • .DER (Distinguish Encoding Rules): Suelen tener la extensión CRT o CER. Es un tipo de codificación de certificados X.509, NO un tipo de certificado. Es un formato binario o raw.
  • .CRT .CERT .CER .PEM (Privacy Enhanced Mail): Ambos son usados indistintamente. .pem contiene el certificado y la clave, mientras que un fichero .crt solo contiene el certificado. Generalmente codificado en Base64, encerrado entre "---BEGIN CERTIFICATE---" y "---END CERTIFICATE---".
  • .CRL (Certificate Revocation List): Fichero que contiene una lista de recovación de certificados.
  • .P7B .P7C: Estructura PKCS#7 SignedData sin datos, solo certificado(s) o CRL(s)
  • .PKCS12 (PKCS #12) .P12 .PFX: Se usa en servidores Windows. Contiene todos los archivos en un único archivo, tanto la clave pública como la clave privada asociada, generada por el servidor en el momento en el que se generó el CSR.
Si necesitamos extraer la clave privada podemos usar OpenSSL el cual utilizará uno de los estándares de criptografía PKCS (Public-Key Cryptography Standards) concretamente PKCS#12 (formatos .PFX) que define un formato de fichero usado comúnmente para almacenar claves privadas con su certificado de clave pública protegido mediante clave simétrica (es decir, una passphrase o contraseña).

Exportamos el certificado autofirmado del servidor IIS. Estará en formato PKCS#12.

Figura 1: Exportando certificado del servidor IIS.

Podemos exportar dicho certificado del propio equipo local a través de la consola de Microsoft para la administración de certificados certmgr.msc. Agregar administrador de certificados a través de un MMC. En el asistente de exportación nos permite la opción de incluir la clave privada en el certificado.

Figura 2: Exportando certificado desde certmgr.msc

Descargar OpenSSL para Windows. A través de una CLI de Windows Server ejecutamos OpenSSL con PKCS12 para la obtención de la clave privada del certificado. Tendremos que extraer el certificado (clave pública), la clave privada (nos pedirá la contraseña en ambos casos) y finalmente eliminar el passphrase de la clave privada extraída.

Figura 3: Usando OpenSSL para la extracción de certificados.

Extraer la clave pública del certificado .pfx
openssl pkcs12 -in certificate.pfx -out public-certificate.cer -clcerts -nokeys
certificate.pfx: certificado pfx del servidor.
public-certificate.cer: clave pública, también se podría exportar a un formato de salida .crt o .pem.
-nokeys: separará la clave pública de la clave privada del certificado .pfx.
-clcerts: certificados de cliente (no certificados de CA).

Figura 4: Fichero de salida de la clave pública.

Extraer la clave privada del certificado .pfx
openssl pkcs12 -in certificate.pfx -out private-key.key -nocerts -nodes
certificate.pfx: certificado pfx del servidor.
private-key.key: clave privada, también se podría exportar a un formato de salida .crt o .pem.
-nocerts: separará la clave privada de la clave pública del certificado .pfx.
-nodes: no cifra la salida de la clave privada (quedando visible en texto plano).

Figura 5: Fichero de salida de la clave privada en texto plano (-nodes).

Extraer la clave privada del certificado .pfx
openssl pkcs12 -in certificate.pfx -out ca-certificate.cer -cacerts -chain -nokeys
certificate.pfxcertificado pfx del servidor.
ca-certificate.cer: certificados CA, también se podría exportar a un formato de salida .crt o .pem.
-chain: incluye toda la cadena de certificados del certificado de usuario.
-cacerts: certificados CA (no certificados de cliente).
-nokeys: separará la clave pública de la clave privada del certificado .pfx.


Eliminar la contraseña de la clave privada extraída del certificado .pfx
openssl rsa -in claveprivada.pem -out claveprivadasinpassphrase.key
Figura 6: Fichero de salida de la clave privada sin passphrase.

Con esto finalmente tendremos la clave privada sin contraseña para poder utilizarla en lo que nos sea necesario.

Convertir certificados CRT, CRT (CA) y clave privada .key a un solo archivo PFX

En el caso de tener el archivo .crt del certificado en sí, el archivo .crt de la CA y el archivo de la clave privada en un .key. Para poder fusionar estos tres ficheros en un solo fichero .pfx (PKCS #12 por lo general, usado en sistemas Windows).
openssl pkcs12 -export -out certificate.pfx -inkey rsaprivate.key -in certificate.crt -certfile fileca.crt
  • certificate.pfx: Certificado de salida en formato pfx.
  • rsaprivate.key: La clave privada.
  • certificate.crt: La clave pública.
  • fileca.crt: Fichero de autoridad de la entidad de certificadora (CA)
En el caso de que simplemente necesitemos obtener un certificado .pfx, por tipo de formato de fichero, solamente en base a la clave privada .key y pública .crt podemos omitir el fichero de la CA.
openssl pkcs12 -export -out certificate.pfx -inkey rsaprivate.key -in certificate.crt
Saludos!

Autor: Adrián Lois

20 comentarios:

  1. si solo tengo el .crt puedo obtener el .key

    ResponderEliminar
    Respuestas
    1. Hola @Carlos, no es posible. Si solo tienes el .crt no se puede obtener el .key.

      Eliminar
  2. Hola Adrián. a mi me mandaron un archivo .cer y al importarlo en Chrome me lo mete en la pestaña otros y no funciona.
    ¿Que debo hacer? ¿Puedo pasarlo a pfx?

    ResponderEliminar
    Respuestas
    1. Hola @caracartucho, no es posible pasar un fichero .cer a .pfx ya que entiendo que no dispones de la clave privada. Los .cer simplemente es ejecutarlo e importarlo en el almacén de certificados raíz para que pueda ser reconocido por los navegadores, no es necesario realizar nada más.

      Un saludo.

      Eliminar
  3. Buenas Tardes Adrian, tengo un certificado de Godaddy .cer y quiero convertirlo a .pfx, ellos me enviaron tres archivos, un .cer, un .pem y un Bundle...cer, de los 3 campos que necesito para correr el comando entiendo entonces que tengo el rsaprivate.key creo que lo saco del CSR, el certificate.crt que es .cer que me enviaron, pero no se a que se refiere el fileca.crt

    ResponderEliminar
    Respuestas
    1. Hola,

      El "fileca.crt" corresponde a la cadena de certificación de la CA (Autoridad Certificadora). Si necesitas instalar esto en un servidor web dependiendo que tipo de servidor y versión deberás incluirlo como un tercer parámetro y a medida que vayas solicitando la renovación de certificado cada x tiempo deberás añadir consecutivamente estas cadenas de certificados para tener correctamente configurado el servicio web, en caso de tratarse de este tipo de servicios.

      Un saludo,
      Adrián.

      Eliminar
  4. Hola Adrian, hay alguna manera de instalar el certificado de personas fisicas de la FNMT en formato pfx? Solo me deja en formato .ere y no es compatible para solicitar prestaciones en el SEPE. Gracias.

    ResponderEliminar
    Respuestas
    1. Hola David, no conozco y nunca he visto un formato .ere para certificados digitales. ¿Quizás te estás confundiendo con la extensión de este formato?.

      Por defecto los certificados expedidos por la FNMT para personas físicas son en formato .pfx. De fácil instalación que contiene la clave pública y privada, simplemente es instalarlo/importarlo en el almacén de certificados locales solamente tu perfil de usuario y no en el almacén de certificados locales a nivel de máquina, ya que de esa forma podría ser utilizado por cualquier usuario que inicie sesión en tu equipo.

      Saludos,
      Adrián.

      Eliminar
  5. Hola buen dia, necesito cierta ayuda.. tengo un certificado .p12, pero en el equipo donde debo cargarlo se debe ingresar 3 certificados que son: CA certificate, User Certificate y Private Key. como podria hacer? gracias

    ResponderEliminar
    Respuestas
    1. Hola Antonio,

      Ya está comentado en el blog. Podrías probar con lo siguiente, lo adapto a tu caso:

      CA certificate:
      openssl pkcs12 -in certificado.p12 -out ca-certificate.cer -cacerts -nokeys -chain

      User Certificate:
      openssl pkcs12 -in certificado.p12 -out public-certificate.cer -clcerts -nokeys

      Private Key:
      openssl pkcs12 -in certificado.p12 -out private-key.key -nocerts -nodes

      Un saludo,
      Adrián.

      Eliminar
  6. Hola, tengo un certificado pfx para emitir Factura Electronica en Afip en un sistema para Windows. Estoy implementando un sistema en Java y quiero utilizar el mismo certificado. En Java necesito un certificado p12. Pregunta : Cómo hago para transformarlo?. Desde y'a muchas gracias por tu respuesta.

    ResponderEliminar
    Respuestas
    1. Hola, pfx y p12 sería lo mismo simplemente es otro tipo de extensión del fichero dependiendo de donde lo hayas exportado.

      ¿Has probado en renombrar el fichero? cambiando manualmente el tipo de extensión y probar a usarlo.

      Un saludo,
      Adrián



      Eliminar
  7. Hola
    Por favor ayuda. Tengo un certificado con token que logro visualizarlo con extension .cer y necesito verlo con .p12 para subir a una plataforma. Es posible? Gracias

    ResponderEliminar
    Respuestas
    1. Hola,

      No es posible. Deberías disponer de la clave pública (.cer) y la clave privada para realizar una exportación en formato .p12.

      Un saludo.

      Eliminar
  8. Hola Adrian! necesito tu ayuda, tengo un certificado y me descarga 4 archivos. midominio.com.pem / midominio.com.key / intermediate.pem / root.pem - Entiendo que el .key deberia cargarlo en KEY - al menos eso creo jaja. pero cual corresponde a CABUNDLE y CRT ?? Muchas gracias desde ya!

    ResponderEliminar
    Respuestas
    1. Hola Bin,

      Los .key son únicos y se referencian como comentas.

      En el caso de Apache. Debes combinar los certificados intermediate.pem / root.pem en un mismo fichero CA_bundle y referenciarlo como SSLCertificateChainFile. Después midominio.com.pem debería ser el SSLCertificateFile.

      En el caso de Nginx. Debes combinar los tres .pem e un mismo fichero referenciándolo como ssl_certificate.

      En el siguiente artículo hablo de ello tanto para un configuración en Apache como Nginx y también de una configuración robusta para los SSL Ciphers.

      https://www.zonasystem.com/2019/08/renovanar-certificados-comprabar-si-el-certificado-clave-privada-y-el-csr-coinciden-openssl.html

      Saludos!
      Adrián.

      Eliminar
  9. Hola, consulta, tengo un certificado .cer y otro .pfx para distribuir en enpoint pero tenia la duda si es posible distribuir a traves de una GPO la llave privada para el certificado .pfx?

    ResponderEliminar
    Respuestas
    1. Hola Carlos,

      Si la necesidad es desplegar un certificado a los endpoints para validar la confianza de un sitio web por ejemplo? el .cer es el único necesario y perfectamente desplegable a través de GPO seleccionando el almacén de certificados adecuado.

      El fichero .pfx contiene la clave pública y privada y esta en ningún caso se debe distribuir este formato a los endpoints para validar un certificado de confianza. Este lo usarás para instalar/implementar el certificado en el servicio legítimo en cuestión.

      Un saludo,
      Adrián.

      Eliminar
    2. Hola Adrian, gracias por la pronta respuesta. Sobre ello mi consulta esta relacionada a que tengo que realizar esa instalación del pfx dentro del endpoint ya que tengo que validar la comunicación entre un servicio que se encuentra en una pc y otra aplicación de escritorio entonces mi duda era si hay forma de desplegar masivamente el pfx por gpom caso contrario tendria que instalarla manualmente equipo por equipo. O que recomendación podria aplicar en este escenario.

      Eliminar
    3. Hola Carlos,

      Desconozco el tipo de servicio pero dudo que sea necesario realizar una instalación del pfx (clave pública y privada) en cada endpoint para validar un cliente hacia un servicio. El servicio estaría instalado en un servidor donde ahí si es necesario instalar ese pfx. Si se trata de un certificado autofirmado aún desde una CA interna solo sería necesario desplegar los .cer a los endpoints para que validen la confianza del certificado instalado en el servicio.

      Respecto a lo segundo, a través de GPO puedes desplegar e incorporar un .cer en un almacén de certificados de los endpoints, pero en el caso de necesitar instalar un pfx podrías desplegar un script PowerShell que se ejecute a través de una tarea programada.

      Ejemplo de script:
      https://www.it-swarm-es.com/es/powershell/importar-archivo-pfx-en-un-almacen-de-certificados-particular-desde-la-linea-de-comandos/971918657/

      Un saludo,
      Adrián.

      Eliminar