Cómo utilizar openssl en Linux para verificar los detalles del certificado SSL

Los certificados SSL son un componente integral para proteger los datos y la conectividad con otros sistemas. Obtenga consejos sobre cómo puede usar el comando openssl de Linux para encontrar detalles críticos del certificado.

Imagen: Getty Images / iStockphoto

La administración de certificados SSL puede ser una tarea ardua, especialmente cuando llega el momento de renovarlos o reemplazarlos. La expiración de los certificados SSL puede ser devastadora para las operaciones tecnológicas, con un impacto que va desde preocupantes mensajes de error del navegador hasta interrupciones completas de la producción. Por lo tanto, es importante no solo estar atento a las próximas caducidades de los certificados SSL (los escaneos de red o al menos un registro de seguimiento de estos certificados son esenciales), sino también verificar completamente el éxito de la renovación / reemplazo de estos certificados.

VER: 5 distribuciones de servidor Linux que debería usar (TechRepublic Premium)

Los archivos de certificado en Linux generalmente se encuentran en la carpeta / etc / pki / tls / certs o posiblemente dentro de una carpeta específica de la aplicación como / etc / httpd para Apache (según el capricho de la persona o proveedor que configuró / construyó la aplicación) . Estos generalmente usan extensiones .pem o .crt y probablemente se llamarán ‘(nombre de host) .pem’ ‘(nombre de host) .crt’, pero a veces también se usa el nombre de archivo genérico del “servidor”.

El comando openssl es una verdadera navaja suiza de funciones que puede utilizar para administrar sus certificados. Para ejemplificar los detalles de un certificado en particular, ejecute el siguiente comando:

openssl x509 -in (path to certificate and certificate filename) -text -noout

Verá un resultado similar al siguiente. Los campos Emisor, Asunto, No antes / Nota después y Nombres alternativos del asunto tendrán los detalles más útiles:

Certificado:
Datos:
Versión: 3 (0x2)
Número de serie:
11: 00: 00: 05: 16: 07: eb: 1b: 1d: 9f: 88: 81: 98: 00: 00: 00: 00: 05: 16
Algoritmo de firma: sha256WithRSAEncryption
Emisor: DC = int, DC = dev, CN = dev emisión baja 01
Validez
No antes: 19 de marzo 15:32:02 2021 GMT
No después: 19 de marzo 15:42:02 2022 GMT
Asunto: C = EE. UU., ST = MA, L = Boston, O = Contoso, OU = Sistemas, CN = test.contoso.com
Información de la clave pública del sujeto:
Algoritmo de clave pública: rsaEncryption
Clave pública: (2048 bits)
Módulo:
00: e9: 0d: 7a: 8c: 55: 54: 4f: ef: 67: a7: a0: 54: de: 8f:
bd: 6c: cd: fe: e5: 01: 22: 40: 90: df: 39: 97: 5a: f6: 76:
c1: d9: 00: d7: 88: 7e: 7b: 63: 65: 99: 59: be: 08: 4a: 3c:
2b: 63: 13: 0d: 42: 3e: 95: 9d: cf: 2f: 2e: 48: 35: 0e: 9c:
6c: 3f: b5: fd: 75: 4f: 7c: 86: 34: 80: c1: 86: be: bf: 0e:
0a: da: a7: eb: 8b: 97: 9f: 29: 34: 1b: fa: c8: b4: f5: 57:
ec: 98: a9: d1: d4: dc: 07: 6e: e0: 14: 51: a3: 7a: 5e: 1c:
b4: e6: a1: 14: 01: 59: a3: a3: 04: f0: 75: 0c: 2e: 6f: 34:
2c: 72: a8: 51: 09: 0d: ad: 53: f4: 34: 58: ab: 23: 01: b8:
51: 1a: 2c: c3: 3f: e2: 75: 4e: 8d: 55: 9a: 2b: 60: c4: 60:
67: 7e: e9: 82: 78: 73: fe: fc: 38: a3: 1f: 1b: 30: f7: 46:
95: 4f: 88: b1: 97: e1: 6d: f6: 85: 3c: 79: 37: f5: 47: 44:
66: 16: ad: 3a: f2: fc: ce: db: a4: 0c: 2d: 6d: 1e: 9e: 20:
b9: b5: eb: ba: de: 93: 3a: 02: a7: 80: 3f: f5: ca: 21: d2:
b1: 34: 56: ba: 95: df: 0f: 3a: f5: fa: 83: 96: fe: aa: 51:
20: 9d: 20: d5: b2: 85: 24: 90: ea: c7: cd: 5d: a2: e7: a5:
ff: c3: d2: 23: f9: ba: 8c: ad: 37: 8b: 8f: 84: ad: 22: 04:
fc: 2d
Exponente: 65537 (0x10001)
Extensiones X509v3:
Uso de la clave X509v3: crítico
Firma digital, cifrado de claves
Uso extendido de la clave X509v3:
Autenticación del servidor web TLS
X509v3 Nombre alternativo del sujeto:
DNS: test.contoso.com, DNS: testhost.contoso.com
Identificador de clave de asunto X509v3:
93: F0: A5: 5F: 72: 91: 05: 67: 84: 42: D2: 0B: A1: 48: 54: 8E: 4E: BB: E0: A0
Identificador de clave de autoridad X509v3:
keyid: 7D: F8: 78: 35: EE: A6: 43: 93: EF: E6: 92: 79: C9: 15: 49: 12: 51: 77: EB: BB

Puntos de distribución de CRL X509v3:

Nombre completo:
URI: ldap: /// CN = dev% 20issuing% 20low% 2001, CN = ca1, CN = CDP, CN = Public% 20Key% 20Services, CN = Services, CN = Configuration, DC = dev, DC = int? CertificateRevocationList ? base? objectClass = cRLDistributionPoint

Acceso a la información de la autoridad:
Emisores de CA – URI: ldap: /// CN = dev% 20issuing% 20low% 2001, CN = AIA, CN = Public% 20Key% 20Services, CN = Services, CN = Configuration, DC = dev, DC = int? CACertificate? base? objectClass =certificationAuthority

1.3.6.1.4.1.311.20.2:
…Servidor web
Algoritmo de firma: sha256WithRSAEncryption
76: d6: 6e: 35: 53: 71: 3b: 1b: f6: 12: 23: b5: 14: e2: 73: c9: e7: d0:
68: e7: 37: ab: 35: bc: fc: e5: 41: 75: f1: 84: 11: 20: ce: 84: 94: dc:
86: 1d: 11: 7a: bd: a0: 5a: 8a: 3b: ac: fc: f1: 4d: 5f: 3a: 3f: 88: a8:
ff: ad: 2e: 2a: 3f: 91: a3: d5: 28: f2: 84: 87: b6: 17: 62: a6: d2: d2:
25: 34: e3: 6d: c0: 3b: 93: f1: a2: 22: 8e: 80: a1: fe: 54: 65: d6: 10:
da: 78: 4b: 0a: f7: eb: 75: d5: 9d: 17: 0b: 87: 8f: 5c: 2d: 39: 49: 59:
b7: e6: b1: 4a: c2: f0: de: 68: 6a: 36: 56: 85: 16: a4: 01: 46: 21: b6:
49: 33: 0b: 4a: ec: c5: 69: 6b: fa: ea: d7: d4: 95: e1: f4: 2d: 17: c5:
ad: bd: 1f: b6: 73: cd: 6c: ae: 5d: ad: ed: 0f: 82: ed: 43: 1c: 0e: ed:
54: 93: 83: d8: 76: 45: d6: 45: 3d: 10: 17: f4: eb: 8a: 84: e8: 9a: 9c:
c6: 5c: 92: df: 2e: c0: 64: 6d: 03: 78: cd: 59: dd: f3: e6: bb: 5c: ac:
c0: 9b: 55: 3f: a5: b6: 12: 90: 0c: ea: e1: 05: 37: 6b: 19: 86: 53: f1:
83: d7: 0b: 23: 6d: fe: 5b: c8: 2f: 22: e3: b5: 6a: bf: cd: 45: 27: 62:
d8: 1b: 1c: a9: be: be: 71: 0c: 07: bd: d3: c2: a4: 63: 1e: eb: 7f: 22:
31: 3a: 8b: 25

También es igualmente útil ejecutar una comprobación contra el puerto asociado con un certificado SSL (por ejemplo, 443 para un servidor web). Puede ejecutar este comando para verificar la fecha de vencimiento de un certificado. Recomiendo encarecidamente ejecutar esto antes y después de reemplazar o renovar un certificado SSL para confirmar el éxito. Tenga en cuenta que al reemplazar los certificados relacionados con la aplicación (como para Apache), es probable que deba reiniciar la aplicación o recoger el nuevo certificado.

Utilice este comando en el sistema host o ejecútelo de forma remota contra ese sistema, sustituyendo “localhost” por el nombre de dominio completo (FQDN) del host que desea verificar y cambiando el puerto 443 según sea necesario para que coincida con el puerto abierto asociado con el certificado SSL.

openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -dates

Debería recibir un resultado similar al siguiente:

No antes: 19 de marzo 15:32:02 2021 GMT
No después: 19 de marzo 15:42:02 2022 GMT

Este script a continuación también se puede usar para extrapolar aún más detalles sobre un certificado y, como se indicó anteriormente, se puede usar de forma local o remota.

Lo llamo ssl_validate.sh, pero puede copiar el contenido en un nuevo archivo de script con el nombre que desee, usar chmod + x para hacerlo ejecutable y luego usarlo con la siguiente sintaxis:

./ssl_validate.sh (o el nombre de secuencia de comandos que elija) servidor.empresa.com:443, donde “server.company.com” es el nombre de dominio completo (FQDN) del host que desea verificar y 443 es el puerto en el que está escuchando asociado con el certificado SSL.

Debe asegurarse de tener una ruta a ese servidor y puerto, por ejemplo, a través de entradas de firewall aprobadas.

El script devolverá un resultado similar al siguiente para mostrar los detalles más destacados del certificado SSL:

server.company.com:443; SSL; CN: (CN del certificado SSL); Asunto (Asunto del certificado SSL); Emisor: (Emisor del certificado SSL); notBefore: (Fecha de creación del certificado SSL); notAfter: (fecha de caducidad del certificado SSL); DaysUntilExpiration: (Días que quedan hasta que caduque el certificado SSL); Errores: (cualquier error relacionado con el certificado SSL)

El guión comienza a continuación:

delim = “;”

exportar delim

serverport = $ {1}

exportar puerto del servidor

echo “# $ {serverport}”

date_today = $ (fecha +% F)

dateiff () {

d1 = $ (fecha -d “$ 1” +% s)

d2 = $ (fecha -d “$ 2” +% s)

echo $ (((d1 – d2) / 86400)) días

}

exportar -f dateiff

sslscan () {

sp local = $ {1}

tls_content = $ (echo “Q” | openssl s_client -showcerts -connect $ {serverport} 2> & 1)

si [[ “$?” == 0 ]]; luego

tls_errors = $ (echo “$ {tls_content}” | grep -i error)

tls_cert_subject = $ (echo “$ {tls_content}” | openssl x509 -noout -subject)

tls_cert_issuer = $ (echo “$ {tls_content}” | openssl x509 -noout -issuer)

tls_cert_cn = $ (echo “$ {tls_content}” | openssl x509 -noout -subject | sed -e “s /.* CN = ([^/]* ). * / 1 / “)

tls_cert_dates = $ (echo “$ {tls_content}” | openssl x509 -noout -dates)

tls_cert_notafter_date = $ (echo “$ {tls_cert_dates}” | grep notAfter | sed -e “s / notAfter = //” | tr -d ‘ n’)

tls_cert_notbefore_date = $ (echo “$ {tls_cert_dates}” | grep notBefor | sed -e “s / notBefore = //” | tr -d ‘ n’)

tls_cert_datediff = $ (dateiff “$ {tls_cert_notafter_date}” “$ {date_today}”)

echo -n “$ {serverport} $ {delim} SSL”

echo -n “$ {delim} CN:”

echo -n “$ {tls_cert_cn}”

echo -n “$ {delim} Asunto:”

echo -n “$ {tls_cert_subject}”

echo -n “$ {delim} Emisor:”

echo -n “$ {tls_cert_issuer}”

echo -n “$ {delim} notBefore:”

echo -n “$ {tls_cert_notbefore_date}”

echo -n “$ {delim} notAfter:”

echo -n “$ {tls_cert_notafter_date}”

echo -n “$ {delim} DaysUntilExpiration:”

echo -n “$ {tls_cert_datediff}”

echo -n “$ {delim} Errores:”

echo -n “$ {tls_errors}”

eco

demás

tls_errors = $ (echo “$ {tls_content}” | tr ‘ n’ ‘/’ | tr ” ‘_’)

status = “ERROR: $ {tls_errors}”

echo -n “$ {serverport} $ {delim} $ {status}”

eco

fi

}

exportar -f sslscan

tiempo de espera 3 bash -c “sslscan $ {serverport}”

si [[ $? != 0 ]]; luego

echo -n “$ {serverport} $ {delim} ERROR: CONNECTION_TIMED_OUT”

eco

fi

Ver también

Leave a Comment