Un certificat X509v3 est un fichier binaire dont la structure est définie par la RFC2459 et le cadre d'utilisation par l'International Telecommunication Union (ITU).
Contrairement au fichier XML pour lequel les données sont transportées en même temps que leurs descriptions, un fichier binaire nécessite pour son exploitation la fourniture d'un lexique permettant la compréhension de son contenu. Le rôle du lexique est joué par un fichier au format Abstract Syntax Notation One (ASN.1). On retrouve ce même langage de définition dans le protocole de management des équipements réseaux SNMP.
Voici le début de cette description pour les certificats
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING } TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version shall be v2 or v3 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version shall be v2 or v3 extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version shall be v3 } Version ::= INTEGER { v1(0), v2(1), v3(2) } CertificateSerialNumber ::= INTEGER
.../...
On en comprend qu'un Certificat est composé de trois éléments :
- Une structure (tbsCertificate)
- Un algorithme de hashage (AlgorithmIdentifier)
- Une signature (signatureValue)
Un certificat n'est donc ni plus ni moins qu'une simple structure binaire dont la valeur est garantie par l'apposition d'une signature (Hash produit par une autorité de confiance). Au passage, remarquons qu'il n'y aucune différence technique entre un certificat, une CA, une CRL, etc ... tous ces fichiers sont des structures binaires associées à une signature.
La version peut prendre trois valeurs : 0,1,2 chacune correspond respectivement à la version v1,v2 et v3 des certicats x509.
Le certificat de https://www.google.com contient ces informations :
C:\openssl-0.9.8g\out32dll>openssl x509 -text -noout -inform DER -in google.der
Certificate:
Data: Version: 3 (0x2) Serial Number: 68:76:64:38:3d:49:6e:2e:f5:e3:19:98:42:e0:7c:ee Signature Algorithm: sha1WithRSAEncryption Issuer: C=ZA, O=Thawte Consulting (Pty) Ltd., CN=Thawte SGC CA Validity Not Before: May 3 15:34:58 2007 GMT Not After : May 14 23:18:11 2008 GMT
.../...
Le certificat est en v3 ( valeur 2 )
OpenSSL permet l'analyse binaire du certificat via l'option asn1parse
C:\openssl-0.9.8g\out32dll>openssl asn1parse -i -inform DER -in google.der
0:d=0 hl=4 l= 801 cons: SEQUENCE 4:d=1 hl=4 l= 650 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= 16 prim: INTEGER :687664383D496E2EF5E3199842E07CEE 31:d=2 hl=2 l= 13 cons: SEQUENCE 33:d=3 hl=2 l= 9 prim: OBJECT :sha1WithRSAEncryption 44:d=3 hl=2 l= 0 prim: NULL 46:d=2 hl=2 l= 76 cons: SEQUENCE 48:d=3 hl=2 l= 11 cons: SET 50:d=4 hl=2 l= 9 cons: SEQUENCE 52:d=5 hl=2 l= 3 prim: OBJECT :countryName 57:d=5 hl=2 l= 2 prim: PRINTABLESTRING :ZA 61:d=3 hl=2 l= 37 cons: SET 63:d=4 hl=2 l= 35 cons: SEQUENCE 65:d=5 hl=2 l= 3 prim: OBJECT :organizationName 70:d=5 hl=2 l= 28 prim: PRINTABLESTRING :Thawte Consulting (Pty) Ltd.
.../...
Nous apprenons que dans le fichier google.der à l'offset 10 se trouve trois octets (hl+l), le troisième octet est un entier dont la valeur est deux.
Avec un éditeur hexa fixons ce 12ème octet du fichier à 1 et voici le résultat
C:\openssl-0.9.8g\out32dll>openssl x509 -text -noout -inform DER -in google.der
Certificate:
Data: Version: 2 (0x1) Serial Number: 68:76:64:38:3d:49:6e:2e:f5:e3:19:98:42:e0:7c:ee Signature Algorithm: sha1WithRSAEncryption Issuer: C=ZA, O=Thawte Consulting (Pty) Ltd., CN=Thawte SGC CA
.../...
Le certificat est bien modifié, le code de hashage pourrait être recalculé mais ne pouvant être signé l'ouverture du certificat donne ceci :
La syntaxe ASN1 : http://www.oss.com/asn1/booksintro.html
Deux librairies opensource ASN.1 : http://lionet.info/asn1c/basics.html , http://josefsson.org/libtasn1/
Un exemple obtenu par libtasn1
c:\libtasn1-0.3.9\tests>..\src\asn1Decoding -c pkix.asn google.der PKIX1.Certificate
Parse: done.
Decoding: SUCCESS
DECODING RESULT: name:NULL type:SEQUENCE
name:tbsCertificate type:SEQUENCE name:version type:INTEGER value:0x02 name:NULL type:DEFAULT value:v1 name:serialNumber type:INTEGER value:0x687664383d496e2ef5e3199842e07cee name:signature type:SEQUENCE name:algorithm type:OBJ_ID value:1.2.840.113549.1.1.5 name:parameters type:ANY value:0500 name:issuer type:CHOICE name:rdnSequence type:SEQ_OF name:NULL type:SET_OF name:NULL type:SEQUENCE name:type type:OBJ_ID name:value type:ANY name:?1 type:SET_OF name:NULL type:SEQUENCE name:type type:OBJ_ID name:value type:ANY name:?1 type:SEQUENCE name:type type:OBJ_ID value:2.5.4.6 name:value type:ANY value:13025a41 name:?2 type:SET_OF name:NULL type:SEQUENCE name:type type:OBJ_ID name:value type:ANY name:?1 type:SEQUENCE name:type type:OBJ_ID value:2.5.4.10 name:value type:ANY value:131c54686177746520436f6e73756c74696e67202850747929204c74642e name:?3 type:SET_OF name:NULL type:SEQUENCE name:type type:OBJ_ID name:value type:ANY name:?1 type:SEQUENCE name:type type:OBJ_ID value:2.5.4.3
.../...