Aspectos esenciales de OpenSSL: Trabajar con certificados SSL, claves privadas y CSR

Introducción

OpenSSL es una herramienta de línea de comandos versátil que se puede utilizar para una amplia variedad de tareas relacionadas con la Infraestructura de Clave Pública (PKI) y HTTPS (HTTP sobre TLS). Esta guía de estilo de hoja de trucos proporciona una referencia rápida a los comandos de OpenSSL que son útiles en escenarios comunes y cotidianos. Esto incluye ejemplos de OpenSSL para generar claves privadas, solicitudes de firma de certificados y conversión de formato de certificados. No cubre todos los usos de OpenSSL.

Cómo Usar Esta Guía:

  • Si no está familiarizado con las solicitudes de firma de certificados (CSRs), lea la primera sección
  • Aparte de la primera sección, esta guía está en formato de hoja de trucos: una lista de fragmentos de línea de comandos autocontenidos
  • Ir a cualquier sección que sea relevante para la tarea que está intentando completar (Consejo: use el menú de Contenidos o la función Buscar de su navegador)
  • La mayoría de los comandos son de una sola línea que se han expandido a múltiples líneas (usando el símbolo \) para mayor claridad

Acerca de las Solicitudes de Firma de Certificados (CSRs)

Si deseas obtener un certificado SSL de una autoridad de certificación comercial (CA), debes generar una solicitud de firma de certificado (CSR). Un CSR consiste principalmente en la clave pública de un par de claves y alguna información adicional. Ambos componentes se insertan en el certificado cuando se firma.

Siempre que generes un CSR, se te pedirá que proporciones información sobre el certificado. Esta información se conoce como Nombre Distinguido (DN). Un campo importante en el DN es el Nombre Común (CN), que debería ser el Nombre de Dominio Completamente Cualificado (FQDN) exacto del host con el que pretendes usar el certificado. También es posible omitir las solicitudes interactivas al crear un CSR al pasar la información a través de la línea de comandos o desde un archivo.

Los otros elementos en un DN proporcionan información adicional sobre tu negocio u organización. Si estás comprando un certificado SSL de una autoridad de certificación, a menudo se requiere que estos campos adicionales, como “Organización”, reflejen con precisión los detalles de tu organización.

Aquí tienes un ejemplo de cómo se verá la solicitud de información de CSR:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Si deseas responder de forma no interactiva a la solicitud de información de CSR, puedes hacerlo agregando la opción -subj a cualquier comando de OpenSSL que solicite información de CSR. Aquí tienes un ejemplo de la opción, usando la misma información mostrada en el bloque de código anterior:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Ahora que entiendes los CSR, siéntete libre de ir a la sección que cubra tus necesidades de OpenSSL.

Generación de CSRs

Esta sección cubre los comandos de OpenSSL relacionados con la generación de CSRs (y claves privadas, si estas no existen). Los CSRs se pueden usar para solicitar certificados SSL a una autoridad de certificación.

Tenga en cuenta que puede agregar la información del CSR de forma no interactiva con la opción -subj, mencionada en la sección anterior.

Generar una Clave Privada y un CSR

Utilice este método si desea utilizar HTTPS (HTTP sobre TLS) para asegurar su servidor web Apache HTTP o Nginx, y desea utilizar una Autoridad de Certificación (CA) para emitir el certificado SSL. El CSR que se genera se puede enviar a una CA para solicitar la emisión de un certificado SSL firmado por la CA. Si su CA admite SHA-2, agregue la opción -sha256 para firmar el CSR con SHA-2.

Este comando crea una clave privada de 2048 bits (domain.key) y un CSR (domain.csr) desde cero:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Responda la solicitud de información del CSR para completar el proceso.

La opción -newkey rsa:2048 especifica que la clave debe ser de 2048 bits, generada utilizando el algoritmo RSA. La opción -nodes especifica que la clave privada no debe estar cifrada con una frase de contraseña. La opción -new, que no se incluye aquí pero se da por implícita, indica que se está generando una CSR.

Generar una CSR a partir de una Clave Privada Existente

Utilice este método si ya tiene una clave privada que le gustaría utilizar para solicitar un certificado a una AC.

Este comando crea una nueva CSR (domain.csr) basada en una clave privada existente (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Responda la solicitud de información de la CSR para completar el proceso.

La opción -key especifica una clave privada existente (domain.key) que se utilizará para generar una nueva CSR. La opción -new indica que se está generando una CSR.

Generar una CSR a partir de un Certificado y una Clave Privada Existente

Utilice este método si desea renovar un certificado existente pero usted o su CA no tienen el CSR original por alguna razón. Básicamente le ahorra la molestia de volver a ingresar la información del CSR, ya que extrae esa información del certificado existente.

Este comando crea un nuevo CSR (domain.csr) basado en un certificado existente (domain.crt) y una clave privada (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

La opción -x509toreq especifica que está utilizando un certificado X509 para hacer un CSR.

Generación de Certificados SSL

Si desea utilizar un certificado SSL para asegurar un servicio pero no requiere un certificado firmado por una CA, una solución válida (y gratuita) es firmar sus propios certificados.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

Esta sección cubre comandos de OpenSSL relacionados con la generación de certificados autofirmados.

Generar un Certificado Autofirmado

Utilice este método si desea utilizar HTTPS (HTTP sobre TLS) para asegurar su servidor web Apache HTTP o Nginx, y no requiere que su certificado esté firmado por una CA.

Este comando crea una clave privada de 2048 bits (domain.key) y un certificado autofirmado (domain.crt) desde cero:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Responde la solicitud de información del CSR para completar el proceso.

La opción -x509 indica a req que cree un certificado autofirmado. La opción -days 365 especifica que el certificado será válido por 365 días. Se genera un CSR temporal para recopilar información para asociar con el certificado.

Generar un Certificado Autofirmado desde una Clave Privada Existente

Usa este método si ya tienes una clave privada con la que te gustaría generar un certificado autofirmado.

Este comando crea un certificado autofirmado (domain.crt) a partir de una clave privada existente (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Responde la solicitud de información del CSR para completar el proceso.

La opción -x509 indica a req que cree un certificado autofirmado. La opción -days 365 especifica que el certificado será válido por 365 días. La opción -new habilita la solicitud de información del CSR.

Generar un certificado autofirmado a partir de una clave privada y una solicitud de firma (CSR) existentes

Utilice este método si ya tiene una clave privada y una CSR, y desea generar un certificado autofirmado con ellas.

Este comando crea un certificado autofirmado (domain.crt) a partir de una clave privada existente (domain.key) y (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

La opción -days 365 especifica que el certificado será válido durante 365 días.

Ver Certificados

Los archivos de certificado y CSR están codificados en formato PEM, que no es legible para humanos de manera directa.

Esta sección cubre los comandos de OpenSSL que mostrarán las entradas reales de los archivos codificados en PEM.

Ver Entradas de CSR

Este comando le permite ver y verificar el contenido de una CSR (domain.csr) en texto plano:

  1. openssl req -text -noout -verify -in domain.csr

Ver Entradas de Certificados

Este comando te permite ver el contenido de un certificado (domain.crt) en texto plano:

  1. openssl x509 -text -noout -in domain.crt

Verificar que un Certificado fue Firmado por una CA

Utiliza este comando para verificar que un certificado (domain.crt) fue firmado por un certificado CA específico (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Claves Privadas

Esta sección cubre comandos de OpenSSL que son específicos para crear y verificar claves privadas.

Crear una Clave Privada

Utiliza este comando para crear una clave privada de 2048 bits protegida por contraseña (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

Ingresa una contraseña cuando se te solicite para completar el proceso.

Verificar una Clave Privada

Utilice este comando para verificar que una clave privada (domain.key) es una clave válida:

  1. openssl rsa -check -in domain.key

Si su clave privada está encriptada, se le solicitará la frase de paso. Tras el éxito, la clave sin encriptar se mostrará en la terminal.

Verificar que una Clave Privada Coincida con un Certificado y CSR

Utilice estos comandos para verificar si una clave privada (domain.key) coincide con un certificado (domain.crt) y un CSR (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Si la salida de cada comando es idéntica, hay una probabilidad extremadamente alta de que la clave privada, el certificado y el CSR estén relacionados.

Encriptar una Clave Privada

Esto toma una clave privada no encriptada (unencrypted.key) y produce una versión encriptada de ella (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Ingrese la frase de paso deseada para encriptar la clave privada.

Descifrar una Clave Privada

Esto toma una clave privada cifrada (encrypted.key) y produce una versión descifrada de la misma (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Ingrese la frase de contraseña para la clave cifrada cuando se le solicite.

Convertir Formatos de Certificados

Todos los certificados con los que hemos estado trabajando han sido certificados X.509 que están codificados en PEM ASCII. Hay una variedad de otros tipos de codificación y contenedores de certificados; algunas aplicaciones prefieren ciertos formatos sobre otros. Además, muchos de estos formatos pueden contener múltiples elementos, como una clave privada, certificado y certificado de CA, en un solo archivo.

OpenSSL se puede utilizar para convertir certificados hacia y desde una gran variedad de estos formatos. Esta sección cubrirá algunas de las conversiones posibles.

Convertir PEM a DER

Use este comando si desea convertir un certificado codificado en PEM (domain.crt) a un certificado codificado en DER (domain.der), un formato binario:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

El formato DER se utiliza típicamente con Java.

Convertir DER a PEM

Utilice este comando si desea convertir un certificado codificado en DER (domain.der) a un certificado codificado en PEM (domain.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

Convertir PEM a PKCS7

Utilice este comando si desea agregar certificados PEM (domain.crt y ca-chain.crt) a un archivo PKCS7 (domain.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Tenga en cuenta que puede utilizar una o más opciones -certfile para especificar qué certificados agregar al archivo PKCS7.

Los archivos PKCS7, también conocidos como P7B, se utilizan típicamente en almacenes de claves Java y en Microsoft IIS (Windows). Son archivos ASCII que pueden contener certificados y certificados de CA.

Convertir PKCS7 a PEM

Utilice este comando si desea convertir un archivo PKCS7 (domain.p7b) a un archivo PEM:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Tenga en cuenta que si su archivo PKCS7 tiene múltiples elementos (por ejemplo, un certificado y un certificado intermedio de CA), el archivo PEM que se crea contendrá todos los elementos en él.

Convertir PEM a PKCS12

Utilice este comando si desea tomar una clave privada (domain.key) y un certificado (domain.crt), y combinarlos en un archivo PKCS12 (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

Se le pedirá contraseñas de exportación, las cuales puede dejar en blanco. Tenga en cuenta que puede agregar una cadena de certificados al archivo PKCS12 concatenando los certificados en un solo archivo PEM (domain.crt) en este caso.

Los archivos PKCS12, también conocidos como archivos PFX, se utilizan típicamente para importar y exportar cadenas de certificados en Microsoft IIS (Windows).

Convertir PKCS12 a PEM

Utilice este comando si desea convertir un archivo PKCS12 (domain.pfx) y convertirlo al formato PEM (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Tenga en cuenta que si su archivo PKCS12 tiene varios elementos en él (por ejemplo, un certificado y una clave privada), el archivo PEM que se crea contendrá todos los elementos en él.

Versión de OpenSSL

El comando openssl version se puede utilizar para verificar qué versión se está ejecutando. La versión de OpenSSL que estás ejecutando y las opciones con las que fue compilada afectan las capacidades (y a veces las opciones de línea de comandos) que están disponibles para ti.

El siguiente comando muestra la versión de OpenSSL que estás ejecutando y todas las opciones con las que fue compilada:

openssl version -a

Esta guía fue escrita utilizando un binario de OpenSSL con los siguientes detalles (la salida del comando anterior):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Conclusión

Eso debería cubrir cómo la mayoría de las personas utilizan OpenSSL para trabajar con certificados SSL. Tiene muchos otros usos que no se trataron aquí, así que siéntete libre de preguntar o sugerir otros usos en los comentarios.

Si tienes problemas con alguno de los comandos, asegúrate de comentar (e incluir la salida de tu versión de OpenSSL).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs