unificadas ucc san precio nombre multidominio instalar estándar con comunicaciones certificado ssl openssl certificate ssl-certificate x509certificate

ssl - ucc - Cómo mostrar el Asunto Nombre alternativo de un certificado?



ssl con nombre (6)

Cómo mostrar el Asunto Nombre alternativo de un certificado?

Puede haber varias SAN en un certificado X509. Lo siguiente es de la wiki de OpenSSL en SSL / TLS Client . Recorre los nombres y los imprime.

Obtiene el X509* de una función como SSL_get_peer_certificate desde una conexión TLS, d2i_X509 desde la memoria o PEM_read_bio_X509 desde el sistema de archivos.

void print_san_name(const char* label, X509* const cert) { int success = 0; GENERAL_NAMES* names = NULL; unsigned char* utf8 = NULL; do { if(!cert) break; /* failed */ names = X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0 ); if(!names) break; int i = 0, count = sk_GENERAL_NAME_num(names); if(!count) break; /* failed */ for( i = 0; i < count; ++i ) { GENERAL_NAME* entry = sk_GENERAL_NAME_value(names, i); if(!entry) continue; if(GEN_DNS == entry->type) { int len1 = 0, len2 = -1; len1 = ASN1_STRING_to_UTF8(&utf8, entry->d.dNSName); if(utf8) { len2 = (int)strlen((const char*)utf8); } if(len1 != len2) { fprintf(stderr, " Strlen and ASN1_STRING size do not match (embedded null?): %d vs %d/n", len2, len1); } /* If there''s a problem with string lengths, then */ /* we skip the candidate and move on to the next. */ /* Another policy would be to fails since it probably */ /* indicates the client is under attack. */ if(utf8 && len1 && len2 && (len1 == len2)) { fprintf(stdout, " %s: %s/n", label, utf8); success = 1; } if(utf8) { OPENSSL_free(utf8), utf8 = NULL; } } else { fprintf(stderr, " Unknown GENERAL_NAME type: %d/n", entry->type); } } } while (0); if(names) GENERAL_NAMES_free(names); if(utf8) OPENSSL_free(utf8); if(!success) fprintf(stdout, " %s: <not available>/n", label); }

La respuesta más cercana que encontré es usando "grep".

> openssl x509 -text -noout -in cert.pem | grep DNS

¿Hay una mejor manera de hacer esto? Yo solo prefiero la línea de comando.

Gracias.


Está mi solución (usando openssl y sed ):

bash primero

sed -ne '' s/^/( */)Subject://1/p; /X509v3 Subject Alternative Name/{ N; s/^.*/n//; :a; s/^/( */)/(.*/), //1/2/n/1/; ta; p; q; }'' < <(openssl x509 -in cert.pem -noout -text)

podría escribirse:

sed -ne ''s/^/( */)Subject://1/p;/X509v3 Subject Alternative Name/{ N;s/^.*/n//;:a;s/^/( */)/(.*/), //1/2/n/1/;ta;p;q; }'' < <( openssl x509 -in cert.pem -noout -text )

y podría representar algo así como:

CN=www.example.com DNS:il0001.sample.com DNS:example.com DNS:demodomain.com DNS:testsite.com DNS:www.il0001.sample.com DNS:www.il0001.sample.com.vsite.il0001.sample.com DNS:www.example.com DNS:www.example.com.vsite.il0001.sample.com DNS:www.demodomain.com DNS:www.demodomain.com.vsite.il0001.sample.com DNS:www.testsite.com DNS:www.testsite.com.vsite.il0001.sample.com

Lo mismo para el servidor en vivo

sed -ne ''s/^/( */)Subject://1/p;/X509v3 Subject Alternative Name/{ N;s/^.*/n//;:a;s/^/( */)/(.*/), //1/2/n/1/;ta;p;q; }'' < <( openssl x509 -noout -text -in <( openssl s_client -ign_eof 2>/dev/null <<<$''HEAD / HTTP/1.0/r/n/r'' / -connect google.com:443 ) )

Salida de mayo:

C=US, ST=California, L=Mountain View, O=Google Inc, CN=*.google.com DNS:*.google.com DNS:*.android.com DNS:*.appengine.google.com DNS:*.cloud.google.com DNS:*.gcp.gvt2.com DNS:*.google-analytics.com DNS:*.google.ca DNS:*.google.cl DNS:*.google.co.in DNS:*.google.co.jp DNS:*.google.co.uk DNS:*.google.com.ar DNS:*.google.com.au DNS:*.google.com.br DNS:*.google.com.co DNS:*.google.com.mx DNS:*.google.com.tr DNS:*.google.com.vn DNS:*.google.de DNS:*.google.es DNS:*.google.fr DNS:*.google.hu DNS:*.google.it DNS:*.google.nl DNS:*.google.pl DNS:*.google.pt DNS:*.googleadapis.com DNS:*.googleapis.cn DNS:*.googlecommerce.com DNS:*.googlevideo.com DNS:*.gstatic.cn DNS:*.gstatic.com DNS:*.gvt1.com DNS:*.gvt2.com DNS:*.metric.gstatic.com DNS:*.urchin.com DNS:*.url.google.com DNS:*.youtube-nocookie.com DNS:*.youtube.com DNS:*.youtubeeducation.com DNS:*.ytimg.com DNS:android.clients.google.com DNS:android.com DNS:developer.android.google.cn DNS:g.co DNS:goo.gl DNS:google-analytics.com DNS:google.com DNS:googlecommerce.com DNS:urchin.com DNS:www.goo.gl DNS:youtu.be DNS:youtube.com DNS:youtubeeducation.com

shell POSIX ahora

Como < <(...) es un bashismo , el mismo comando debe escribirse:

openssl x509 -in cert.pem -noout -text | sed -ne '' s/^/( */)Subject://1/p; /X509v3 Subject Alternative Name/{ N; s/^.*/n//; :a; s/^/( */)/(.*/), //1/2/n/1/; ta; p; q; }''

y

printf ''HEAD / HTTP/1.0/r/n/r/n'' | openssl s_client -ign_eof 2>/dev/null -connect google.com:443 | openssl x509 -noout -text | sed -ne ''s/^/( */)Subject://1/p;/X509v3 Subject Alternative Name/{ N;s/^.*/n//;:a;s/^/( */)/(.*/), //1/2/n/1/;ta;p;q; }''


Puede usar awk para acercarse a la SAN, conectando las opciones anteriores a la declaración awk :

openssl x509 -in mycertfile.crt -text -noout / -certopt no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_subject,no_issuer,no_pubkey,no_sigdump,no_aux / | awk ''/X509v3 Subject Alternative Name/'',''/X509v3 Basic Constraints/''


Solución muy simple usando grep

openssl x509 -in /path/to/x509/cert -noout -text|grep -oP ''(?<=DNS:|IP Address:)[^,]+''|sort -uV

Para el certificado de google, este resultados:

android.clients.google.com android.com developer.android.google.cn g.co goo.gl google.com googlecommerce.com google-analytics.com hin.com urchin.com www.goo.gl youtu.be youtube.com youtubeeducation.com *.android.com *.appengine.google.com *.cloud.google.com *.gcp.gvt2.com *.googleadapis.com *.googleapis.cn *.googlecommerce.com *.googlevideo.com *.google.ca *.google.cl *.google.com *.google.com.ar *.google.com.au *.google.com.br *.google.com.co *.google.com.mx *.google.com.tr *.google.com.vn *.google.co.in *.google.co.jp *.google.co.uk *.google.de *.google.es *.google.fr *.google.hu *.google.it *.google.nl *.google.pl *.google.pt *.gstatic.cn *.gstatic.com *.gvt1.com *.gvt2.com *.metric.gstatic.com *.urchin.com *.url.google.com *.youtubeeducation.com *.youtube.com *.ytimg.com *.google-analytics.com *.youtube-nocookie.com


Tenga en cuenta que puede limitar la salida de -text a solo las extensiones agregando la siguiente opción:

-certopt no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_issuer,no_pubkey,no_sigdump,no_aux

es decir:

openssl x509 -text -noout -in cert.pem / -certopt no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_issuer,no_pubkey,no_sigdump,no_aux

Sin embargo, aún deberá aplicar cierta lógica de análisis de texto para obtener solo el Subject Alternative Name del Subject Alternative Name .

Si eso no es suficiente, creo que necesitarás escribir un pequeño programa que use la biblioteca de openssl para extraer el campo específico que estás buscando. Estos son algunos ejemplos de programas que muestran cómo analizar un certificado, incluida la extracción de campos de extensión como el nombre Subject Alternative Name :

https://zakird.com/2013/10/13/certificate-parsing-with-openssl

Tenga en cuenta que no tiene que usar openssl y C si va por la ruta de programación ... puede elegir su idioma favorito y la biblioteca de analizador ASN.1 , y usar eso. Por ejemplo, en Java, puede usar http://jac-asn1.sourceforge.net/ y muchos otros.


Tomado de https://.com/a/13128918/1695680

$ true | openssl s_client -connect example.com:443 | openssl x509 -noout -text | grep DNS:

Ejemplo

$ true | openssl s_client -connect localhost:8443 | openssl x509 -noout -text | grep DNS: depth=2 C = US, ST = NC, L = SomeCity, O = SomeCompany Security, OU = SomeOU, CN = SomeCN verify error:num=19:self signed certificate in certificate chain DONE DNS:localhost, DNS:127.0.0.1, DNS:servername1.somedom.com, DNS:servername2.somedom.local