Obtenir des chaînes d'émetteur ASN.1 à partir de fichiers PEM?
Question
J'ai récemment rencontré un problème avec Windows 2003 (apparemment, il existe également dans d'autres versions). Si un serveur SSL / TLS demande l'authentification du certificat client et qu'il possède plus de 16 Ko de DN de certificat sécurisés, Internet Explorer (ou toute autre application qui utilise schannel.dll) est incapable de terminer la négociation SSL. (En résumé, le serveur divise le message en blocs de 2 ^ 14 octets, conformément à la RFC 2246 sec. 6.2.1, mais Schannel n’a pas été écrit pour supporter cela. Le support technique de Microsoft a confirmé qu’il s’agissait là d'une défaut dans Schannel et qu’ils envisagent de le réparer dans une version ultérieure.)
J'essaie donc de trouver un moyen d'analyser facilement mes certificats de confiance (j'utilise Apache comme serveur; ils sont donc tous au format PEM) pour obtenir la longueur totale en format ASN.1 des DN. c'est comment ils sont envoyés sur le fil pendant la poignée de main), et ainsi voir si je m'approche trop de la limite. Cependant, je n'ai pas encore trouvé le moyen de le faire: la fonction OpenSSL asn1parse se rapproche, mais elle ne semble pas fournir de moyen d'obtenir la séquence ASN.1 uniquement pour le nom de l'émetteur, ce qui est ce qui suit. J'ai besoin.
Des suggestions?
La solution
Etant donné que ASN.1 est auto-descriptif, il est assez facile d’écrire un analyseur syntaxique ASN.1. Comme vous le savez probablement, les données ASN.1 contiennent une arborescence de valeurs, où chaque type de valeur est identifié par un OID attribué globalement. Vous pouvez trouver un décodeur ASN.1 gratuit avec le code source à l'adresse: http://www.geocities.co.jp/SiliconValley- SanJose / 3377 / asn1JS.html . Il est écrit en javascript pour que vous puissiez jouer directement dans votre navigateur.
En ce qui concerne votre question exacte - je voudrais:
- Utilisez l'analyseur fourni, trouvez-en un autre ou écrivez le mien
- Recherchez l'OID du nom distinctif (vérifiez la spécification ou décodez simplement un certificat à l'aide de la page de décodeur ASN.1 fournie)
- Combinez les deux opérations ci-dessus pour extraire la taille des noms distinctifs approuvés dans un certificat.
Autres conseils
openssl asn1parse le fera, mais vous devrez effectuer une analyse manuelle pour déterminer le début de la séquence de l'émetteur. Conformément à la RFC 5280, il s'agit du quatrième élément de la séquence TBSCertificate (potentiellement le troisième s'il s'agit d'un certificat v1), immédiatement après l'algorithme de signature. Dans l'exemple suivant:
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
le nom distinctif de l'émetteur commence au décalage 31 et a une longueur d'en-tête de deux et une longueur de valeur de 64, pour une longueur totale de 66 octets. Ce n'est pas si facile à script, bien sûr ...