Ottenere ASN.1 Emittente stringhe dal file PEM?
Domanda
Recentemente mi sono imbattuto in un problema con Windows 2003 (a quanto pare esiste anche in altre versioni), dove se un SSL/TLS server richiede l'autenticazione del certificato client e ha più di 16 kb di certificato attendibile DNs, Internet Explorer (o qualsiasi altra applicazione che utilizza schannel.dll) è in grado di completare l'handshake SSL.(In sintesi, il server si rompe il messaggio in blocchi di 2^14 byte, secondo la RFC 2246 sec.6.2.1, ma Schannel non è stata scritta per il supporto che.Ho ricevuto conferma dal supporto Microsoft che questo è un difetto in Schannel e che si sta valutando di fissaggio in una versione futura.)
Così sto cercando di trovare un modo per analizzare facilmente attraverso il mio certificati attendibili (io uso Apache come il mio server, in modo che tutti sono in formato PEM) per ottenere il totale ASN.1-formato di lunghezza del DNs (che è il modo in cui vengono inviati oltre il filo durante la stretta di mano), e, quindi, vedere se sono sempre troppo vicino al limite.Io non sono ancora stato in grado di trovare un modo per fare questo, però:OpenSSL asn1parse funzione si avvicina, ma non mi sembra quello di fornire un modo per ottenere l'ASN.1 sequenza solo per il nome dell'emittente, che è ciò di cui ho bisogno.
Qualche suggerimento?
Soluzione
Dal ASN.1 è auto che descrive, è abbastanza facile scrivere un ASN.1 parser.Come probabilmente sapete, ASN.1 dati contiene un albero di valori, in cui ogni tipo di valore è identificata da un livello globale assegnato OID (Object ID).È possibile trovare un ASN.1 decoder con codice sorgente a: http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html.Si;'s scritto in javascript e ci si può giocare direttamente nel tuo browser.
Per la tua precisa domanda - vorrei:
- Utilizzare la dotazione parser, di trovarne un altro, o scrivere il mio
- Trovare l'OID di fiducia DNs (verificare le specifiche o semplicemente decodificare un certificato utilizzando il cavo fornito ASN.1 decoder pagina)
- Combinare i due sopra per estrarre la dimensione di fiducia DNs all'interno di un certificato.
Altri suggerimenti
openssl asn1parse di farlo, ma è necessario fare qualche manuale di analisi per capire dove l'emittente inizia la sequenza.Per RFC 5280, è il 4 ° elemento della TBSCertificate sequenza (potenzialmente 3 ° se è un v1 certificato), segue immediatamente l'algoritmo di firma.Nell'esempio riportato di seguito:
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
l'Emittente DN inizia all'offset 31 e ha un header di lunghezza di due e un valore di lunghezza di 64 anni, per una lunghezza totale di 66 byte.Questo non è così semplice script, ovviamente...