2013-04-05 20 views
7

Ho un certificato in formato X509. questo è un parametro di input in una funzione. Quello che mi piacerebbe fare è verificare la validità del certificato. Come può essere fatto?Come verificare un certificato X509 in C

X509_verify_cert(); 

ho trovato questa funzione, ma questo non accetta un certificato X509 *, accetta X509_store e ho solo una X509.

Grazie migliori saluti.

+0

Si può considerare restringendo la piattaforma * * su cui si sta tentare di farlo, anche se con questo potrebbe essere troppo nebuloso per questo forum di domande e risposte. – WhozCraig

+0

Il nome della funzione è fuorviante - non verifica completamente la validità del certificato, devi anche controllare se i nomi host corrispondono, non dimenticarti di farlo. C'è una funzione per esso dal momento che OpenSSL 1.0.2: https://www.openssl.org/docs/manmaster/crypto/X509_check_email.html –

risposta

7

Vedere la documentazione here.

È necessario creare un archivio certificati utilizzando X509_STORE_CTX_new. Quindi aggiungere la catena di certificati utilizzando X509_STORE_CTX_set_chain. Aggiungi certificato di root attendibile utilizzando X509_STORE_CTX_trusted_stack. Infine aggiungi il certificato da verificare usando X509_STORE_CTX_set_cert.

Dopo quella chiamata X509_verify_cert.

Spero che questo ti aiuti a iniziare su questo.

+0

grazie per la risposta rapida. è stato utile. – mmm

14

Sono qui solo per pubblicare la mia risposta come l'ho trovata con i commenti sopra.

Non avevo una catena di certificati, quindi nel lavoro che sto facendo ho solo un certificato generato da me in modo programmatico. Volevo verificarne la validità, quindi ho creato la seguente funzione, che controlla il certificato in se stesso in altri per verificarne la validità.

void check_certificate_validaty(X509* certificate) 
{ 
    int status; 
    X509_STORE_CTX *ctx; 
    ctx = X509_STORE_CTX_new(); 
    X509_STORE *store = X509_STORE_new(); 

    X509_STORE_add_cert(store, certificate); 

    X509_STORE_CTX_init(ctx, store, certificate, NULL); 

    status = X509_verify_cert(ctx); 
    if(status == 1) 
    { 
     printf("Certificate verified ok\n"); 
    }else 
    { 
     printf("%s\n", X509_verify_cert_error_string(ctx->error)); 
    } 
} 

Spero che questo aiuti qualcuno :)

+0

In breve, il codice sopra può essere utilizzato per convalidare i certificati autofirmati. – jaaw

3

Per verificare una firma del certificato, è necessario la chiave pubblica di un certificato dell'emittente. La firma di questo certificato emittente è verificata con un altro certificato di rilascio (o certificato radice attendibile). Pertanto, se la firma di un certificato verifica tutta la catena fino a una radice attendibile, tale certificato viene considerato attendibile. firme

certificati autofirmati sono verificati utilizzando la propria chiave pubblica, come nell'esempio qui sotto:

int verify_cert(const char* pem_c_str) 
{ 
    BIO *bio_mem = BIO_new(BIO_s_mem()); 
    BIO_puts(bio_mem, pem_c_str); 
    X509 * x509 = PEM_read_bio_X509(bio_mem, NULL, NULL, NULL); 

    EVP_PKEY *pkey=X509_get_pubkey(x509); 
    int r= X509_verify(x509, pkey); 
    EVP_PKEY_free(pkey); 

    BIO_free(bio_mem); 
    X509_free(x509); 
    return r; 
} 

da: http://www.zedwood.com/article/openssl-c-verify-self-signed-certificate-signature

Problemi correlati