Tengo un archivo SSL CRT en formato PEM. ¿Hay alguna manera de extraer el nombre común (CN) del certificado desde la línea de comandos?
Tengo un archivo SSL CRT en formato PEM. ¿Hay alguna manera de extraer el nombre común (CN) del certificado desde la línea de comandos?
Respuestas:
Si lo ha openssl
instalado, puede ejecutar:
openssl x509 -noout -subject -in server.pem
openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-]*\).*$/\1/'
obtener solo el dominio, ya que tenía detalles adicionales después de la CN. Su juego no muy estricta para un CN válido, pero en la mayoría de los casos funciona, que podría ser más holgura y reemplazar [a-zA-Z0-9\.\-]
con [^/]
, pero no estoy seguro de que siempre iba a funcionar.
\*
a lo que @flungo solía admitir dominios comodín: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/'
( [^/]
funciona en mi caso, sin embargo)
sed
comandos sugeridos anteriormente no funcionarán si el certificado tiene Nombres distinguidos relativos (RDN) especificados después del Nombre común (CN), por ejemplo, OU (Unidad organizativa) o C (País). Una manera de tener en cuenta tales casos sería un adicional sed
: openssl x509 -noout -subject -in server.pem | sed 's/^.*CN=//' | sed sed 's/\/.*$//'
.
openssl x509 -noout -subject -nameopt multiline | grep commonName
o solo por el valor| sed -n 's/ *commonName *= //p'
certtool -i < whatever.pem | egrep "^\s+Subject:"
Observe que está dirigiendo el archivo a la entrada estándar a través <
, no usándolo como argumento. Sin egrep
embargo, esto imprimirá todo el certificado, pero el CN está en el Subject:
campo cerca de la parte superior (tenga en cuenta que también hay un valor CN en el Issuer:
campo).
X.509 Certificate Information:
Version: 3
Serial Number (hex): 01
Issuer: [...] CN=unixandlinux.ex <- Not this one.
Validity: ...
Subject: CN=goldilocks
certtool
es parte de gnutls, si no está instalado solo búscalo. GnuTLS es un poco mejor que OpenSSL, IMO.
gnutls-certtool
que fue instalado a través debrew install gnutls
gnutls-bin
Encontré la respuesta anterior, y la encontré muy útil, pero también encontré que la certtool
sintaxis del comando (en Ubuntu Linux, hoy) era notablemente diferente a la descrita por Ricitos de Oro, como era el resultado. Entonces, pensé que era mejor actualizar esa excelente respuesta con lo que podría ser la "versión de hoy".
La "i"
opción (¿ahora?) Significa "importar" según man certtool
, por lo que el comando adecuado parece ser "d"
"mostrar". Entonces, este comando:
certtool d myfoo.crt
(La extensión del archivo en mi caso simplemente .crt
no es .pem
... esto no es relevante).
... produce una salida que, en la parte relevante, se ve así:
Common Name : Foobar
Sin lugar a dudas, Ricitos de Oro tenía razón: la certtool
salida es mucho más fácil, más fácil de trabajar que openssl
en este caso.
certtool
que tomara opciones sin los operadores habituales ( -
o --
), y man certtool
para la versión 3.5.8 (debian), 3.5.16 (fedora, la única versión después de eso en la rama estable ascendente es 3.5.17 de hace un mes), la documentación en línea de GnuTLS y, de hecho, la página de manual en línea para Ubuntu 17.10 (la misma versión que Debian actual) se refieren a: