2013-04-05 15 views
7

Mam certyfikat w formacie X509. to są parametry wejściowe w funkcji. To, co chciałbym zrobić, to zweryfikować ważność certyfikatu. Jak to zrobić?Jak zweryfikować certyfikat X509 w C

X509_verify_cert(); 

Znalazłem tę funkcję, ale nie akceptuje certyfikat X509 *, akceptuje X509_store i mam tylko X509.

Dzięki Pozdrawiamy.

+0

Można rozważyć zawężenie * * platformę, na której jesteś próbując to osiągnąć, choć nawet z tym może to być zbyt mdłe dla tego forum pytań i odpowiedzi. – WhozCraig

+0

Nazwa funkcji jest myląca - nie w pełni sprawdza ważność certyfikatu, należy również sprawdzić, czy nazwy hostów są zgodne, nie zapomnij tego zrobić. Jest w tym funkcja, ponieważ OpenSSL 1.0.2: https://www.openssl.org/docs/manmaster/crypto/X509_check_email.html –

Odpowiedz

7

Zobacz dokumentację here.

Musisz utworzyć magazyn certyfikatów za pomocą X509_STORE_CTX_new. Następnie dodaj łańcuch certyfikatów, używając X509_STORE_CTX_set_chain. Dodaj zaufany certyfikat główny, używając X509_STORE_CTX_trusted_stack. Na koniec dodaj certyfikat do zweryfikowania za pomocą X509_STORE_CTX_set_cert.

Po tym wywołaniu X509_verify_cert.

Mam nadzieję, że pomoże ci to rozpocząć.

+0

dziękuję za szybką odpowiedź. to było pomocne. – mmm

14

Jestem tutaj, aby opublikować moją odpowiedź, ponieważ znalazłem ją z powyższymi komentarzami.

Nie miałem łańcucha certyfikatów, więc w pracy, którą wykonuję, mam tylko wygenerowany przeze mnie certyfikat programowy. Chciałem sprawdzić jego poprawność, dlatego stworzyłem następującą funkcję, która sprawdza certyfikat w sobie samym w innych, aby zweryfikować jego ważność.

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

Nadzieja to pomaga ktoś :)

+0

W skrócie powyższy kod może służyć do sprawdzania certyfikatów z podpisem własnym. – jaaw

3

Aby zweryfikować podpis certyfikat, trzeba klucza publicznego świadectwa wystawcy. Ten podpis certyfikatu wystawcy jest weryfikowany przy użyciu innego wystawiającego certyfikatu (lub zaufanego certyfikatu głównego). Zatem jeśli podpis certyfikatu weryfikuje całą drogę do łańcucha do zaufanego katalogu głównego, certyfikat ten jest uznawany za zaufany. Podpisy

certyfikatów z podpisem własnym są weryfikowane przy użyciu własnego klucza publicznego, jak na poniższym przykładzie:

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

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