From Grandville.net

OpenSSL: Openssl-asn1



La structure binaire d'un certificat


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.

Modification de la version du certificat

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 :

fake google certificat



Liens et outils

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

.../...

Retrieved from http://www.grandville.net?n=OpenSSL.Openssl-asn1
Page last modified on July 28, 2008, at 10:02 PM