12
A
回答
15
我已經減少verify.c(OpenSSL中/應用/ )到所需的最小功能。假設:cert和CA cert都是PEM格式文件。沒有要求的CRLS或可信列表檢查。
使用您的證書和CA PEM文件的路徑調用verify()。
static int verify(const char* certfile, const char* CAfile);
static X509 *load_cert(const char *file);
static int check(X509_STORE *ctx, const char *file);
int verify(const char* certfile, const char* CAfile)
{
int ret=0;
X509_STORE *cert_ctx=NULL;
X509_LOOKUP *lookup=NULL;
cert_ctx=X509_STORE_new();
if (cert_ctx == NULL) goto end;
OpenSSL_add_all_algorithms();
lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_file());
if (lookup == NULL)
goto end;
if(!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM))
goto end;
lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_hash_dir());
if (lookup == NULL)
goto end;
X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT);
ret = check(cert_ctx, certfile);
end:
if (cert_ctx != NULL) X509_STORE_free(cert_ctx);
return ret;
}
static X509 *load_cert(const char *file)
{
X509 *x=NULL;
BIO *cert;
if ((cert=BIO_new(BIO_s_file())) == NULL)
goto end;
if (BIO_read_filename(cert,file) <= 0)
goto end;
x=PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
end:
if (cert != NULL) BIO_free(cert);
return(x);
}
static int check(X509_STORE *ctx, const char *file)
{
X509 *x=NULL;
int i=0,ret=0;
X509_STORE_CTX *csc;
x = load_cert(file);
if (x == NULL)
goto end;
csc = X509_STORE_CTX_new();
if (csc == NULL)
goto end;
X509_STORE_set_flags(ctx, 0);
if(!X509_STORE_CTX_init(csc,ctx,x,0))
goto end;
i=X509_verify_cert(csc);
X509_STORE_CTX_free(csc);
ret=0;
end:
ret = (i > 0);
if (x != NULL)
X509_free(x);
return(ret);
}
1
openssl verify -CAfile <CA_cert_filename> <unknown_cert_filename>
命令會做你想做的事 - 試圖找到可以做你想做的API的代碼是很痛苦的,所以我建議找到openssl verify
例程的源代碼。
(如果你有實現的選擇,GNUTLS看起來很有希望:
#include <gnutls/x509.h>
int gnutls_x509_crt_verify(gnutls_x509_crt_t cert, const gnutls_x509_crt_t
* CA_list, int CA_list_length, unsigned int flags, unsigned int * verify);
但OpenSSL的是安裝無處不在 ..)
相關問題
- 1. Ruby Net的公鑰/私鑰驗證:: SFTP
- 2. 獲取給定證書的頒發CA
- 3. 哪個CA頒發時間戳證書
- 4. 使用自定義CA公鑰文件驗證證書?
- 5. 證書頒發機構vs存儲的公鑰
- 6. 您的連接不是私人的
- 7. 私人公鑰是不同
- 8. 爲什麼證書頒發機構(CA)從中間頒發機構頒發證書而不是根頒發機構頒發證書?
- 9. 下載DoD證書頒發機構(CA)證書的鏈接
- 10. 驗證私鑰和公鑰RSA密鑰匹配
- 11. 如果您使用XML序列化,您如何驗證數據?
- 12. 私鑰/公鑰
- 13. openssl api驗證公鑰是否與私鑰匹配
- 14. PHP驗證碼:什麼是「私鑰」和「公鑰」?
- 15. SSL證書:公鑰或私鑰?
- 16. ssh私鑰/公鑰認證示例
- 17. 從Windows Server 2008獲取頒發證書的信息CA
- 18. 使用CA頒發證書的相互SSL
- 19. 您如何使用MSAL驗證AAD B2C?
- 20. 如何爲iPhone開發生成新的公鑰/私鑰對?
- 21. 如何在github中查看您的私人活動?
- 22. 您如何驗證用戶爲您的應用生成的「應用」?
- 23. Node.js的內部證書頒發機構(CA)https.request:如何指向.PEM?
- 24. 分享您的trello開發人員API密鑰可以嗎?
- 25. 如何獲得Apple開發人員證書/私鑰?
- 26. Microsoft CA:從私鑰來的地方
- 27. 如何爲HTTPS服務器設置私鑰/公鑰和證書?
- 28. 如何存儲RSA私鑰,公鑰
- 29. 需要驗證。您需要登錄到您的Google帳戶。應用發佈後
- 30. 如何向Firebase提供您自己的JWT簽名密鑰驗證碼
你能解釋帶有註釋的代碼嗎我無法理解這個驗證過程的邏輯 – Balamurugan 2011-07-07 05:50:03
是否可以使用內存代替文件?我想讓A向B發送證書,並進行驗證。任何人想分享代碼?非常感謝。 – user180574 2013-01-08 22:54:52
user180574 - 我想你需要使用BIO_new_mem_buf – John 2013-01-20 19:29:19