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:
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
):
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
):
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:
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
):
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
):
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:
Ver Entradas de Certificados
Este comando te permite ver el contenido de un certificado (domain.crt
) en texto plano:
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
):
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
):
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:
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
):
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
):
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
):
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:
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
):
Convertir PEM a PKCS7
Utilice este comando si desea agregar certificados PEM (domain.crt
y ca-chain.crt
) a un archivo PKCS7 (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:
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
):
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).