2013-04-05 6 views
7

Ich habe ein Zertifikat im X509-Format. Dies ist ein Eingabeparameter in einer Funktion. Was ich tun möchte, ist die Gültigkeit des Zertifikats zu überprüfen. Wie kann es gemacht werden?Wie überprüfe ich ein X509-Zertifikat in C

X509_verify_cert(); 

ich diese Funktion gefunden, aber dies ist kein X509 * Zertifikat akzeptieren, akzeptiert es X509_store und ich habe nur eine X509.

Dank mit freundlichen Grüßen.

+0

Sie die * Verengung betrachten kann * Plattform, auf dem Sie sind der Versuch, dies zu erreichen, auch wenn dies für dieses Q & A-Forum zu nebulös ist. – WhozCraig

+0

Der Funktionsname ist irreführend - er überprüft nicht vollständig die Gültigkeit des Zertifikats, Sie müssen auch überprüfen, ob die Hostnamen übereinstimmen, vergessen Sie nicht, dies zu tun. Es gibt eine Funktion dafür seit OpenSSL 1.0.2: https://www.openssl.org/docs/manmaster/crypto/X509_check_email.html –

Antwort

7

Siehe Dokumentation here.

Sie müssen einen Zertifikatspeicher mit X509_STORE_CTX_new erstellen. Fügen Sie dann die Zertifikatskette mit X509_STORE_CTX_set_chain hinzu. Fügen Sie vertrauenswürdiges Stammzertifikat mithilfe von X509_STORE_CTX_trusted_stack hinzu. Fügen Sie schließlich das Zertifikat hinzu, das mit X509_STORE_CTX_set_cert verifiziert werden soll.

Danach rufen Sie X509_verify_cert.

Ich hoffe, dass dies Ihnen dabei helfen wird.

+0

Vielen Dank für Ihre schnelle Antwort. Es war hilfreich. – mmm

14

Ich bin hier, nur um meine Antwort zu posten, wie ich es mit den obigen Kommentaren gefunden habe.

Ich hatte keine Zertifikatskette, also habe ich bei der Arbeit, die ich mache, nur ein Zertifikat, das ich programmatisch erzeugt habe. Ich wollte die Gültigkeit überprüfen, also habe ich die folgende Funktion erstellt, die das Zertifikat gegen sich selbst überprüft, um die Gültigkeit zu überprüfen.

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)); 
    } 
} 

Hope this jemand hilft :)

+0

Kurz gesagt kann Code verwendet werden, um selbst signierte Zertifikate zu validieren. – jaaw

3

ein Zertifikat Signatur zu überprüfen, müssen Sie den öffentlichen Schlüssel eines Emittenten Zertifikat. Die Signatur dieses Ausstellerzertifikats wird mit einem anderen ausstellenden Zertifikat (oder vertrauenswürdigem Stammzertifikat) verifiziert. Wenn die Signatur eines Zertifikats die gesamte Kette bis zu einem vertrauenswürdigen Stamm verifiziert, wird dieses Zertifikat als vertrauenswürdig betrachtet.

Selbst signierte Zertifikate Signaturen überprüft ihre eigenen öffentlichen Schlüssel verwenden, wie im folgenden Beispiel:

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; 
} 

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

Verwandte Themen