La seguridad de la capa de transporte (TLS) es una parte importante de cualquier estrategia de seguridad, y las aplicaciones más allá de los servidores web aprovechan cada vez más las protecciones que ofrece la criptografía de clave pública. El kit de herramientas de OpenSSL es la utilidad fundamental que cualquier administrador de sistemas debe conocer si es responsable de mantener las aplicaciones protegidas por TLS. En este artículo, demuestro algunos de los comandos más comunes que uso a diario. Si bien muchos artículos se centran en la generación de solicitudes de firma de certificados (CSR) o certificados autofirmados, este artículo dedicará algún tiempo a revisar los comandos de OpenSSL y frases ingeniosas más allá del proceso de generación de certificados.
[ También le puede interesar: Hacer que los certificados de CA estén disponibles para las herramientas de línea de comandos de Linux]
Comprobación de la validez del certificado
Uno de los pasos de solución de problemas más comunes que tomará es verificar la validez básica de una cadena de certificados enviada por un servidor, lo que puede lograrse mediante el openssl s_client
dominio. El siguiente ejemplo muestra una cadena de certificados verificada con éxito enviada por un servidor (redhat.com) después de una conexión en el puerto 443. El -brief
flag excluye algunos de los resultados más detallados que OpenSSL normalmente mostraría. Tenga en cuenta que la "Verificación" se muestra como "OK".
Por defecto, openssl s_client
leerá desde la entrada estándar los datos para enviarlos al servidor remoto. Agregar un echo
to the one-liner envía una nueva línea e inmediatamente finaliza la conexión. Sin esto, tendría que presionar Ctrl+C para salir de la conexión.
$ echo | openssl s_client -connect redhat.com:443 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = North Carolina, L = Raleigh, O = "Red Hat, Inc.", OU = Information Technology, CN = *.redhat.com
Hash used: SHA256
Signature type: RSA
Verification: OK
Supported Elliptic Curve Point Formats: uncompressed
Server Temp Key: ECDH, P-256, 256 bits
DONE
Compare el resultado anterior con el siguiente ejemplo. En este resultado, puede ver claramente que la verificación falló con un error:"certificado autofirmado".
$ echo | openssl s_client -connect self-signed.badssl.com:443 -brief
depth=0 C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
verify error:num=18:self signed certificate
CONNECTION ESTABLISHED
Protocol version: TLSv1.2
Ciphersuite: ECDHE-RSA-AES128-GCM-SHA256
Peer certificate: C = US, ST = California, L = San Francisco, O = BadSSL, CN = *.badssl.com
Hash used: SHA512
Signature type: RSA
Verification error: self signed certificate
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Server Temp Key: ECDH, P-256, 256 bits
DONE
Determinar cuándo caduca un certificado
Todos los administradores de sistemas han experimentado la vergüenza que se deriva de permitir que caduque un certificado para un sitio web público. Hay muchas herramientas de monitoreo para vigilar esto y asegurarse de que no le suceda a usted, pero ¿qué sucede si solo desea verificar rápidamente la fecha de vencimiento de un certificado desde la línea de comandos? OpenSSL lo tiene cubierto.
La comprobación de la fecha de caducidad de un certificado implica una sola línea compuesta por dos comandos OpenSSL:s_client
y x509
. Ya viste cómo s_client
establece una conexión a un servidor en el ejemplo anterior. Al canalizar la salida a x509
, puede obtener el período de validez del certificado utilizando las -dates
bandera. A continuación se muestran ejemplos de certificados válidos y caducados.
# A valid certificate that hasn’t expired yet
$ echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Jul 9 00:00:00 2019 GMT
notAfter=Aug 2 12:00:00 2021 GMT
# A certificate that expired in 2015
$ echo | openssl s_client -connect expired.badssl.com:443 2>/dev/null | openssl x509 -noout -dates
notBefore=Apr 9 00:00:00 2015 GMT
notAfter=Apr 12 23:59:59 2015 GMT
Nota :Si recibe un certificado SSL predeterminado en lugar del certificado del servidor, consulte esta explicación de SNI (Indicación del nombre del servidor).
Comprobación de extensiones de certificado
Las extensiones X509 permiten agregar campos adicionales a un certificado. Uno de los más comunes es el nombre alternativo del sujeto (SA). La SAN de un certificado permite que se asocien varios valores (por ejemplo, varios FQDN) con un solo certificado. La SAN incluso se usa cuando no hay varios valores porque el uso del nombre común de un certificado para la verificación está obsoleto.
Al igual que en el resumen anterior, la canalización de la salida entre varios comandos de OpenSSL facilita la inspección de extensiones de certificado específicas y le permite ver las SAN asociadas con un certificado:
$ echo | openssl s_client -connect redhat.com:443 2>/dev/null | openssl x509 -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:*.redhat.com, DNS:redhat.com
Otro conjunto común de extensiones incluye las restricciones básicas y el uso de claves de un certificado. Específicamente, es posible que desee comprobar si se permite utilizar un certificado como autoridad de certificación. Nuevamente, esto se puede hacer de la misma manera que se puede buscar una SAN:
$ openssl x509 -ext basicConstraints,keyUsage -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
Comprobación de versiones o cifrados TLS en desuso
Existen excelentes herramientas basadas en la web, como Qualys SSL Lab, para brindarle un informe completo sobre la seguridad de su configuración TLS. Esto incluye alertarlo sobre el uso de conjuntos de cifrado inseguros y otros parámetros de configuración que pueden debilitar la postura de seguridad de un recurso protegido por TLS. Sin embargo, es posible que desee ejecutar una prueba rápida desde la línea de comandos, y OpenSSL lo hace fácil.
En primer lugar, puede enumerar los cifrados admitidos para una versión particular de SSL/TLS utilizando los openssl ciphers
dominio. A continuación, puede ver que he enumerado los cifrados admitidos para TLS 1.3. El -s
flag le dice al comando ciphers que solo imprima aquellos cifrados compatibles con la versión TLS especificada (-tls1_3
):
$ openssl ciphers -s -tls1_3
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
El s_client
El comando se puede usar para probar diferentes versiones de TLS y conjuntos de cifrado. El sitio web Ciphersuites.info es un depósito útil de información sobre la solidez de varios conjuntos de cifrado. Como ejemplo, intentar usar la suite TLS_PSK_WITH_AES_128_CBC_SHA débil contra un servidor que no lo admite dará como resultado un error:
openssl s_client -connect redhat.com:443 -cipher PSK-AES128-CBC-SHA -quiet -no_tls1_3
139963477378368:error:141A90B5:SSL routines:ssl_cipher_list_to_bytes:no ciphers available:../ssl/statem/statem_clnt.c:3794:No ciphers enabled for max supported SSL/TLS version
Del mismo modo, puede especificar la versión del protocolo TLS utilizado en la conexión. El siguiente ejemplo muestra que el servidor no admite TLS 1.1. Asegúrese de revisar la página de manual para ver una lista completa de opciones.
$ openssl s_client -connect redhat.com:443 -tls1_1 -quiet
139890998576448:error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available:../ssl/statem/statem_clnt.c:1112:
Inspeccionar un certificado
He cubierto el análisis de partes particulares de un certificado, como las fechas de validez o las extensiones X509. A veces, solo desea ver todo sobre un certificado específico. La utilidad X509 se puede usar con -noout
(para suprimir la impresión del certificado codificado), -text
(para imprimir información de texto sobre el certificado) y -in
(para especificar el archivo de entrada) banderas para imprimir todo lo que le gustaría saber sobre un certificado en particular. El siguiente ejemplo usa un archivo de certificado en mi sistema local, pero podría canalizar fácilmente la salida desde openssl s_client
, como se ve en los ejemplos anteriores.
$ openssl x509 -text -noout -in /usr/share/ca-certificates/mozilla/VeriSign_Universal_Root_Certification_Authority.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
40:1a:c4:64:21:b3:13:21:03:0e:bb:e4:12:1a:c5:1d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
Validity
Not Before: Apr 2 00:00:00 2008 GMT
Not After : Dec 1 23:59:59 2037 GMT
Subject: C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2008 VeriSign, Inc. - For authorized use only", CN = VeriSign Universal Root Certification Authority
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:c7:61:37:5e:b1:01:34:db:62:d7:15:9b:ff:58:
5a:8c:23:23:d6:60:8e:91:d7:90:98:83:7a:e6:58:
19:38:8c:c5:f6:e5:64:85:b4:a2:71:fb:ed:bd:b9:
da:cd:4d:00:b4:c8:2d:73:a5:c7:69:71:95:1f:39:
3c:b2:44:07:9c:e8:0e:fa:4d:4a:c4:21:df:29:61:
8f:32:22:61:82:c5:87:1f:6e:8c:7c:5f:16:20:51:
44:d1:70:4f:57:ea:e3:1c:e3:cc:79:ee:58:d8:0e:
c2:b3:45:93:c0:2c:e7:9a:17:2b:7b:00:37:7a:41:
33:78:e1:33:e2:f3:10:1a:7f:87:2c:be:f6:f5:f7:
42:e2:e5:bf:87:62:89:5f:00:4b:df:c5:dd:e4:75:
44:32:41:3a:1e:71:6e:69:cb:0b:75:46:08:d1:ca:
d2:2b:95:d0:cf:fb:b9:40:6b:64:8c:57:4d:fc:13:
11:79:84:ed:5e:54:f6:34:9f:08:01:f3:10:25:06:
17:4a:da:f1:1d:7a:66:6b:98:60:66:a4:d9:ef:d2:
2e:82:f1:f0:ef:09:ea:44:c9:15:6a:e2:03:6e:33:
d3:ac:9f:55:00:c7:f6:08:6a:94:b9:5f:dc:e0:33:
f1:84:60:f9:5b:27:11:b4:fc:16:f2:bb:56:6a:80:
25:8d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
1.3.6.1.5.5.7.1.12:
0_.].[0Y0W0U..image/gif0!0.0...+..............k...j.H.,{..0%.#http://logo.verisign.com/vslogo.gif
X509v3 Subject Key Identifier:
B6:77:FA:69:48:47:9F:53:12:D5:C2:EA:07:32:76:07:D1:97:07:19
Signature Algorithm: sha256WithRSAEncryption
4a:f8:f8:b0:03:e6:2c:67:7b:e4:94:77:63:cc:6e:4c:f9:7d:
0e:0d:dc:c8:b9:35:b9:70:4f:63:fa:24:fa:6c:83:8c:47:9d:
3b:63:f3:9a:f9:76:32:95:91:b1:77:bc:ac:9a:be:b1:e4:31:
21:c6:81:95:56:5a:0e:b1:c2:d4:b1:a6:59:ac:f1:63:cb:b8:
4c:1d:59:90:4a:ef:90:16:28:1f:5a:ae:10:fb:81:50:38:0c:
6c:cc:f1:3d:c3:f5:63:e3:b3:e3:21:c9:24:39:e9:fd:15:66:
46:f4:1b:11:d0:4d:73:a3:7d:46:f9:3d:ed:a8:5f:62:d4:f1:
3f:f8:e0:74:57:2b:18:9d:81:b4:c4:28:da:94:97:a5:70:eb:
ac:1d:be:07:11:f0:d5:db:dd:e5:8c:f0:d5:32:b0:83:e6:57:
e2:8f:bf:be:a1:aa:bf:3d:1d:b5:d4:38:ea:d7:b0:5c:3a:4f:
6a:3f:8f:c0:66:6c:63:aa:e9:d9:a4:16:f4:81:d1:95:14:0e:
7d:cd:95:34:d9:d2:8f:70:73:81:7b:9c:7e:bd:98:61:d8:45:
87:98:90:c5:eb:86:30:c6:35:bf:f0:ff:c3:55:88:83:4b:ef:
05:92:06:71:f2:b8:98:93:b7:ec:cd:82:61:f1:38:e6:4f:97:
98:2a:5a:8d
Generando algunos datos aleatorios
En este punto, se siente cómodo conectándose a servidores e inspeccionando certificados. Terminaré con un último truco que con frecuencia me resulta útil. El openssl rand
El comando se puede utilizar para generar bytes pseudoaleatorios. El -base64
flag codificará en base64 la salida, proporcionándole una cadena aleatoria que se puede usar como contraseña o para otras aplicaciones que requieren una cadena aleatoria. Solo asegúrese de que la cantidad de bytes sea divisible por tres para evitar el relleno.
$ openssl rand -base64 9
Emo+xQINmYoU
[ Obtenga este libro gratuito de Red Hat y O'Reilly - Operadores de Kubernetes:Automatización de la plataforma de orquestación de contenedores. ]
Resumir
En este artículo, aprendió algunos comandos básicos de OpenSSL que pueden facilitar su vida diaria como administrador de sistemas. OpenSSL es un conjunto de herramientas (y biblioteca de software) muy poderoso, y este artículo solo tocó la superficie de su funcionalidad. Sin embargo, estos comandos son un buen punto de partida para desarrollar un mayor conocimiento de OpenSSL y un conjunto útil de herramientas para tener en la caja de herramientas de cualquier administrador de sistemas que trabaje regularmente con servidores protegidos por TLS.