Erster ASN.1 Emittent Strings aus PEM-Dateien?
Frage
Ich habe kürzlich ein Problem mit Windows 2003 (anscheinend es existiert auch in anderen Versionen auch), wo, wenn eine SSL / TLS-Server-Client-Zertifikat Authentifizierung anfordert und es hat mehr als 16 KB vertrauenswürdigen Zertifikat DNs, Internet Explorer (oder jede andere Anwendung, die schannel.dll verwendet) ist nicht in der Lage, den SSL-Handshake abzuschließen. (Auf den Punkt gebracht, bricht der Server die Nachricht in Stücke von 2 ^ 14 Bytes, gemäß RFC 2246 sec. 6.2.1, aber Schannel wurde geschrieben, das nicht zu unterstützen. Ich habe bekommen eine Bestätigung von Microsoft Support, dass dies eine ist Fehler in Schannel und dass sie in Anbetracht es in einer zukünftigen Version zu befestigen.)
Also ich versuche, einen Weg finden, um bequem durch meine vertrauenswürdigen Zertifikate zu analysieren (ich benutze Apache wie mein Server, so dass alle von ihnen sind im PEM-Format), um die Gesamt ASN.1-Format Länge der DNs zu erhalten ( das ist, wie sie über den Draht während des Handshake gesendet werden), und damit sehen, ob ich zu nahe an die Grenze zu bekommen. Ich habe noch nicht gelungen, einen Weg zu finden, dies zu tun, aber: die OpenSSL asn1parse Funktion nahe kommt, aber es scheint nicht, einen Weg, um die ASN.1-Sequenz für nur den Namen des Emittenten zu erhalten, die, was ist ich brauche.
Irgendwelche Vorschläge?
Lösung
Da ASN.1 Selbst beschreiben, es ist ziemlich einfach, einen ASN.1-Parser zu schreiben. Wie Sie wahrscheinlich wissen, enthält ASN.1 Daten einen Baum von Werten, wobei jeder Wert Typ durch einen global zugewiesen OID (Objekt-ID) identifiziert wird. Sie können einen kostenlosen ASN.1-Decoder mit Quellcode finden Sie unter: http://www.geocities.co.jp/SiliconValley- San Jose / 3377 / asn1JS.html . Es;. 'S in Javascript geschrieben, so dass Sie mit ihm direkt in Ihrem Browser spielen können
Wie genau auf Ihre Frage - ich würde:
- Verwenden Sie den mitgelieferten Parser, ein anderes finden oder schreibe meine eigenen
- Finden Sie die OID vertrauenswürdiger DNs (die Spezifikation prüfen oder einfach ein Zertifikat entschlüsseln mit der mitgelieferten ASN.1-Decoder Seite)
- Kombinieren Sie die beiden oben die Größe der vertrauenswürdigen DNs in einem Zertifikat zu extrahieren.
Andere Tipps
openssl asn1parse wird es tun, aber Sie werden einige manuelle Parsen tun müssen, um herauszufinden, wo der Emittent Sequenz beginnt. Per RFC 5280, ist es das vierte Element in der tbsCertificate Sequenz (potentiell 3. wenn es sich um eine v1-Zertifikat), unmittelbar nach dem Signaturalgorithmus. Im folgende Beispiel:
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
Issuer DN beginnt am Offset 31 und hat eine Kopflänge von zwei und einen Wert Länge von 64, für eine Gesamtlänge von 66 Bytes. Das ist nicht so einfach zu Skript, natürlich ...