9 votes

Interroger les extensions sur les certificats X509 en utilisant OpenSSL

Je travaille avec la classe de certificat X509 de la bibliothèque OpenSSL et j'ai besoin d'interroger l'extension "key usage".

Après avoir abandonné la "documentation" vaporeuse d'OpenSSL, quelques recherches sur le web ont finalement révélé que je devais appeler

X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx) 

et la recherche dans l'en-tête du fichier objects.h a révélé le bon NID.

Le problème est que cet appel renvoie un pointeur vers void, qui apparemment peut pointer vers une variété de structures en fonction de l'extension demandée.

Comme aucune de ces fonctions ne semble être documentée, il n'y a aucun moyen de savoir comment analyser ce que la fonction renvoie.

Quelqu'un peut-il m'indiquer un document qui en parle réellement, au lieu de se contenter d'énumérer des choses que je peux trouver par moi-même (le profil de la fonction, le fichier dont elle provient, etc.) ?

5voto

kuester2000 Points 5327

Les solutions les plus simples pour lire l'utilisation des clés semblent être les suivantes

X509* x509_cert = ...
// without X509_check_ca x509_cert->ex_kusage always returns 0 (no idea why)
int ca = X509_check_ca(x509_cert);
unsigned long usage = x509_cert->ex_kusage;

Les valeurs résultantes sont définies dans opensc/pkcs15-init.h

SC_PKCS15INIT_X509_DIGITAL_SIGNATURE     0x0080UL
SC_PKCS15INIT_X509_NON_REPUDIATION       0x0040UL
SC_PKCS15INIT_X509_KEY_ENCIPHERMENT      0x0020UL
SC_PKCS15INIT_X509_DATA_ENCIPHERMENT     0x0010UL
SC_PKCS15INIT_X509_KEY_AGREEMENT         0x0008UL
SC_PKCS15INIT_X509_KEY_CERT_SIGN         0x0004UL
SC_PKCS15INIT_X509_CRL_SIGN              0x0002UL

Je suis arrivé à cette conclusion en trouvant le code suivant d'un fichier source d'openssl

/* Handle key usage */
if((usage=X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) {
    if(usage->length > 0) {
        x->ex_kusage = usage->data[0];
        if(usage->length > 1) 
        x->ex_kusage |= usage->data[1] << 8;
    } else x->ex_kusage = 0;
    x->ex_flags |= EXFLAG_KUSAGE;
    ASN1_BIT_STRING_free(usage);
}

1voto

Joe Points 17829

Le deuxième paramètre (nid) détermine le type retourné.

En regardant ce code :

http://opengrok.creo.hu/dragonfly/xref/src/crypto/openssl-0.9/crypto/x509v3/v3_purp.c#X509_check_purpose

Il semble que pour le NID d'utilisation de la clé, il renvoie un ASN1_BIT_STRING. (ligne 361).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X