2009-02-04 19 views
7

Sto lavorando con la classe di certificato X509 della libreria OpenSSL e ho bisogno di interrogare l'estensione "utilizzo chiave".Interrogazione di estensioni su certificati X509 tramite OpenSSL

Dopo aver abbandonato vapourware "documentazione" di OpenSSL, qualche colpo-in-the-dark Web ricerca alla fine ha rivelato che avevo bisogno di chiamare

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

e la ricerca attraverso l'intestazione objects.h rivelato il corretto NID.

Il problema è che questa chiamata restituisce un puntatore a vuoto, che a quanto pare può puntare a una varietà di strutture a seconda dell'estensione richiesta.

Poiché nessuno di questi sembra essere documentato, uno è lasciato senza un modo per capire come analizzare ciò che la funzione restituisce.

Qualcuno può indicarmi un documento che parla di questo, invece di elencare solo le cose che posso scoprire da solo (il profilo della funzione, da quale file proviene, ecc.)?

+1

Non ho risposta, ma in secondo luogo il sentimento sulla qualità della documentazione per OpenSSL ... Ci sto lavorando anche ora (appena iniziando), ed è orribile cercare di trovare esempi o documenti per qualcosa che vada oltre le semplici operazioni ... Sento il tuo dolore. – Nick

+1

L'unico modo in cui ho capito come utilizzare l'API era prendere lo strumento della riga di comando (origine), eseguire il codice (commentare i parametri sulla riga di comando di cui non avevo bisogno) e tracciare. Da lì ho potuto utilizzare i "doc" dell'API per colmare le lacune. – Joe

risposta

5

Le soluzioni più semplici per leggere l'utilizzo della chiave sembra essere

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; 

I valori risultanti sono definiti in 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 

Sono venuto a che soultion trovando il codice seguente di un file sorgente di 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

Il mio 'x509.h' contiene l'avvertimento:'/* Questi contengono copie di vari valori di estensione */'per molti degli elementi nella struttura X509, incluso' ex_kusage'. Questo è probabilmente il motivo per cui è zero finché non chiami quella funzione. – chacham15

+0

devi controllare il valore di 'ex_flags' se ha' EXFLAG_SET' che significa 'ex_kusage' e 'ex_xkusage' sono impostati e non hai bisogno di chiamare' X509_check_ca', puoi controllare 'v3_purp.c' per maggiori dettagli – bikram990

Problemi correlati