我擁有X509格式的證書。這是一個函數中的輸入參數。 我想要做的是驗證證書的有效性。 怎麼辦?如何驗證C中的X509證書
X509_verify_cert();
我發現這個功能,但是這並不接受X509 *證書,它接受X509_store我只有一個X509。
謝謝 最好的問候。
我擁有X509格式的證書。這是一個函數中的輸入參數。 我想要做的是驗證證書的有效性。 怎麼辦?如何驗證C中的X509證書
X509_verify_cert();
我發現這個功能,但是這並不接受X509 *證書,它接受X509_store我只有一個X509。
謝謝 最好的問候。
我在這裏只是發佈我的答案,因爲我發現它與上述評論。
我沒有證書鏈,所以在我正在做的工作中,我只通過編程生成了一個證書。我想檢查它的有效性,所以我創建了以下函數,它在其他函數中檢查證書以驗證證書的有效性。
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));
}
}
希望這可以幫助別人:)
簡而言之,上面的代碼可以用來驗證自簽名證書。 – jaaw 2016-03-16 01:49:52
驗證證書籤名,則需要發行人證書的公鑰。此頒發者證書的簽名通過另一個頒發證書(或受信任的根證書)進行驗證。因此,如果一個證書的簽名驗證了一個鏈到一個受信任的根,那麼該證書被認爲是可信的。
自簽名證書的簽名都是用自己的公鑰驗證,如下面的例子:
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
您可以考慮縮小的* *平臺上你試圖做到這一點,但即使這樣,這個問答論壇可能太模糊了。 – WhozCraig 2013-04-05 15:11:35
函數名稱具有誤導性 - 它沒有完全驗證證書的有效性,您還必須檢查主機名是否匹配,不要忘記這麼做。自OpenSSL 1.0.2以來有一個函數:https://www.openssl.org/docs/manmaster/crypto/X509_check_email.html – 2015-09-14 14:57:04