2009-02-04 4 views
7

Je travaille avec la classe de certificat X509 de la bibliothèque OpenSSL et j'ai besoin d'interroger l'extension «utilisation des clés».Interrogation des extensions sur les certificats X509 à l'aide d'OpenSSL

Après avoir abandonné « documentation » de vapourware de OpenSSL, une prise de vue en le noir recherche sur le Web a 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 objects.h révélais le JNV approprié.

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

Puisqu'aucun de ceux-ci ne semble être documenté, on est laissé sans moyen de comprendre comment analyser ce que la fonction renvoie. Est-ce que quelqu'un peut me diriger vers un document qui en parle, au lieu de simplement faire une liste de choses que je peux trouver moi-même (le profil de la fonction, de quel fichier provient-il, etc.)?

+1

Je n'ai pas de réponse, mais je vais 2ème le sentiment de la qualité de la documentation pour OpenSSL ... Je travaille aussi maintenant (tout juste en commençant), et c'est horrible d'essayer de trouver des exemples ou des documents pour autre chose que de simples opérations ... Je ressens votre douleur. – Nick

+1

La seule façon dont j'ai compris comment utiliser l'API était de prendre l'outil de ligne de commande (source), de hacker le code (commenter les paramètres de la ligne de commande dont je n'avais pas besoin) et de tracer. De là, j'ai pu utiliser l'API "docs" pour combler les lacunes. – Joe

Répondre

5

Les solutions les plus faciles à lire l'utilisation de la clé semble être

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 venu à cette soultion en trouvant le code suivant d'un fichier source 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); 
} 
+0

Mon 'x509.h' contient l'avertissement:'/* Ceux-ci contiennent des copies de diverses valeurs d'extension */'pour la plupart des éléments de la structure X509, y compris' ex_kusage'. C'est probablement pourquoi c'est zéro jusqu'à ce que vous appeliez cette fonction. – chacham15

+0

vous devez vérifier la valeur de 'ex_flags' s'il a' EXFLAG_SET' qui signifie 'ex_kusage' et' ex_xkusage' sont définis et vous n'avez pas besoin d'appeler 'X509_check_ca', vous pouvez vérifier' v3_purp.c' pour plus de détails – bikram990

Questions connexes