2013-04-05 252 views
7

我擁有X509格式的證書。這是一個函數中的輸入參數。 我想要做的是驗證證書的有效性。 怎麼辦?如何驗證C中的X509證書

X509_verify_cert(); 

我發現這個功能,但是這並不接受X509 *證書,它接受X509_store我只有一個X509。

謝謝 最好的問候。

+0

您可以考慮縮小的* *平臺上你試圖做到這一點,但即使這樣,這個問答論壇可能太模糊了。 – WhozCraig 2013-04-05 15:11:35

+0

函數名稱具有誤導性 - 它沒有完全驗證證書的有效性,您還必須檢查主機名是否匹配,不要忘記這麼做。自OpenSSL 1.0.2以來有一個函數:https://www.openssl.org/docs/manmaster/crypto/X509_check_email.html – 2015-09-14 14:57:04

回答

7

請參閱文檔here

您需要使用X509_STORE_CTX_new創建證書存儲。 然後使用X509_STORE_CTX_set_chain添加證書鏈。使用X509_STORE_CTX_trusted_stack添加受信任的根證書。 最後添加要使用X509_STORE_CTX_set_cert進行驗證的證書。

之後,調用X509_verify_cert。

我希望這會幫助你開始。

+0

感謝您的快速回答。這很有幫助。 – mmm 2013-04-07 13:06:55

14

我在這裏只是發佈我的答案,因爲我發現它與上述評論。

我沒有證書鏈,所以在我正在做的工作中,我只通過編程生成了一個證書。我想檢查它的有效性,所以我創建了以下函數,它在其他函數中檢查證書以驗證證書的有效性。

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

希望這可以幫助別人:)

+0

簡而言之,上面的代碼可以用來驗證自簽名證書。 – jaaw 2016-03-16 01:49:52

3

驗證證書籤名,則需要發行人證書的公鑰。此頒發者證書的簽名通過另一個頒發證書(或受信任的根證書)進行驗證。因此,如果一個證書的簽名驗證了一個鏈到一個受信任的根,那麼該證書被認爲是可信的。

自簽名證書的簽名都是用自己的公鑰驗證,如下面的例子:

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

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