Obtención de ASN.1 Emisor de cadenas a partir de los archivos PEM?
Pregunta
Recientemente me encontré con un problema con Windows 2003 (al parecer también existe en otras versiones), donde si un SSL/TLS servidor solicita la autenticación de certificado de cliente y cuenta con más de 16 KB de un certificado de confianza de DNs, Internet Explorer (o cualquier otra aplicación que utiliza schannel.dll) es incapaz de completar el protocolo de enlace SSL.(En pocas palabras, el servidor se descompone el mensaje en trozos de 2^14 bytes, como por RFC 2246 sec.6.2.1, pero Schannel no fue escrita para apoyar eso.He recibido la confirmación de soporte técnico de Microsoft que este es un fallo en Schannel y que están considerando la posibilidad de fijarlo en una versión futura.)
Así que estoy tratando de encontrar una manera de analizar con facilidad a través de mis certificados de confianza (yo uso de Apache como mi servidor, por lo que todos ellos están en formato PEM) para obtener el total de la ASN.1-el formato de la longitud de los DNs (que es como se los envía a través del cable durante el apretón de manos), y por lo tanto a ver si me estoy poniendo demasiado cerca del límite.Todavía no he sido capaz de encontrar una manera de hacer esto, sin embargo:el OpenSSL asn1parse función viene cerca, pero no parece proporcionar una forma para obtener la ASN.1 secuencia de sólo el nombre de emisor, que es lo que necesito.
Alguna sugerencia?
Solución
Desde ASN.1 se auto describe, es bastante fácil escribir un ASN.1 analizador.Como usted probablemente sabe, la ASN.1 datos contiene un árbol de valores, donde cada tipo de valor es identificado por un global asignado OID (IDENTIFICADOR de Objeto).Usted puede encontrar libre de la ASN.1 decodificador con código fuente en: http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html.Es;'s escrito en javascript, así que puedes jugar directamente en tu navegador.
En cuanto a tu pregunta exacta - me gustaría:
- Utilice el cable analizador, a encontrar otro o escribir mi propio
- Encontrar el OID de confianza DNs (verificación de la especificación o simplemente decodificar un certificado utilice el adaptador de ASN.1 decodificador de la página)
- Combinar los dos de arriba para extraer el tamaño de la confianza de DNs en el interior de un certificado.
Otros consejos
openssl asn1parse va a hacer, pero tendrás que hacer algún manual de análisis para averiguar si el emisor de la secuencia comienza.Por RFC 5280, es la 4ª elemento en la TBSCertificate secuencia (potencialmente 3º si es una v1 certificado), inmediatamente después de la firma del algoritmo.En el siguiente ejemplo:
0:d=0 hl=4 l= 621 cons: SEQUENCE
4:d=1 hl=4 l= 470 cons: SEQUENCE
8:d=2 hl=2 l= 3 cons: cont [ 0 ]
10:d=3 hl=2 l= 1 prim: INTEGER :02
13:d=2 hl=2 l= 1 prim: INTEGER :02
16:d=2 hl=2 l= 13 cons: SEQUENCE
18:d=3 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption
29:d=3 hl=2 l= 0 prim: NULL
31:d=2 hl=2 l= 64 cons: SEQUENCE
33:d=3 hl=2 l= 11 cons: SET
35:d=4 hl=2 l= 9 cons: SEQUENCE
37:d=5 hl=2 l= 3 prim: OBJECT :countryName
42:d=5 hl=2 l= 2 prim: PRINTABLESTRING :US
46:d=3 hl=2 l= 26 cons: SET
48:d=4 hl=2 l= 24 cons: SEQUENCE
50:d=5 hl=2 l= 3 prim: OBJECT :organizationName
55:d=5 hl=2 l= 17 prim: PRINTABLESTRING :Test Certificates
74:d=3 hl=2 l= 21 cons: SET
76:d=4 hl=2 l= 19 cons: SEQUENCE
78:d=5 hl=2 l= 3 prim: OBJECT :commonName
83:d=5 hl=2 l= 12 prim: PRINTABLESTRING :Trust Anchor
97:d=2 hl=2 l= 30 cons: SEQUENCE
99:d=3 hl=2 l= 13 prim: UTCTIME :010419145720Z
114:d=3 hl=2 l= 13 prim: UTCTIME :110419145720Z
129:d=2 hl=2 l= 59 cons: SEQUENCE
el Emisor DN comienza en el desplazamiento 31 y tiene una cabecera de longitud de dos y un valor de longitud de 64, para una longitud total de 66 bytes.Esto no es tan fácil de secuencia de comandos, por supuesto...