GNU/Linux >> Tutoriales Linux >  >> Linux

6 opciones de comandos de OpenSSL que todo administrador de sistemas debería conocer

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.


Linux
  1. Temas de sonido en Linux:Lo que todo usuario debe saber

  2. 3 trucos útiles que todo usuario de Linux debe conocer

  3. Opciones útiles de ps

  4. 20 ejemplos de comandos OpenSSL que debes conocer

  5. Lista de comandos de Linux que todo desarrollador debe conocer

34 comandos básicos de Linux que todo usuario debe conocer

Atajos de teclado de Ubuntu que todo usuario debe conocer

Aprenda los conceptos básicos de redes que todo administrador de sistemas necesita saber

5 comandos de Linux que todo usuario de Linux debe conocer

5 trucos simples de Bash History que todo usuario de Linux debe saber

Accesos directos útiles de la terminal de Linux que todo usuario avanzado de Linux debe conocer