首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

OpenSSL 編程實戰指南:從基礎 API 到證書驗證完整範例

     編輯:關於C語言

OpenSSL 編程實戰指南:從基礎 API 到證書驗證完整範例

OpenSSL 是功能豐富的開源安全工具箱,支援 SSL/TLS 協議、對稱/非對稱加密、摘要、大數運算、PKI 憑證全生命週期。本文提供 12 個完整可編譯範例,涵蓋堆疊、雜湊表、記憶體檢測、動態載入、BIO 抽象層、配置檔、亂數、錯誤處理、憑證請求、CRL、憑證驗證等核心場景。

環境準備

# 下載
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1l.tar.gz
# 編譯安裝參考:https://www.cnblogs.com/274914765qq/p/4548980.html
# 編譯範例通用命令
gcc example.c -o example -L/usr/lib -lssl -lcrypto

範例總覽

編號主題核心 API
1堆疊STACK_OF, sk_*_push/find/pop_free
2雜湊表lh_new, lh_insert/retrieve/doall
3記憶體洩漏檢測CRYPTO_mem_ctrl, CRYPTO_mem_leaks
4動態模組載入DSO_load, DSO_bind_var
5.1-5.5BIO (Mem/File/Socket/MD/SSL)BIO_new, BIO_read/write, BIO_f_md, BIO_new_ssl_connect
6.1-6.2配置檔解析NCONF_load, NCONF_get_string/number
7亂數產生器RAND_add/seed/bytes/poll
9錯誤處理ERR_get_error, ERR_print_errors, ERR_put_error
10憑證請求 (PKCS#10)X509_REQ_new, X509_REQ_sign, PEM_write_bio_X509_REQ
11CRL 憑證撤銷列表X509_CRL_new, X509_CRL_sign, X509_CRL_print
12憑證驗證鏈X509_STORE, X509_STORE_CTX, X509_verify_cert

精選核心範例解析

BIO 抽象層:統一 I/O 介面

BIO 將記憶體、檔案、Socket、SSL、摘要等統一為「可讀寫物件」,支援鏈式組合:

// MD5 摘要 BIO 鏈
BIO *bmd = BIO_new(BIO_f_md());
BIO_set_md(bmd, EVP_md5());
BIO *bnull = BIO_new(BIO_s_null());
bnull = BIO_push(bmd, bnull); // bmd 在頂層
BIO_write(bnull, "openssl", 7);
BIO_gets(bnull, buf, sizeof(buf)); // 取得摘要

憑證驗證完整流程

X509_STORE *store = X509_STORE_new();
X509_STORE_CTX *ctx = X509_STORE_CTX_new();
// 1. 載入根證書
X509 *ca = d2i_X509(NULL, &der, len);
X509_STORE_add_cert(store, ca);
// 2. 載入待驗證證書
X509 *cert = d2i_X509(NULL, &der2, len2);
// 3. 初始化驗證上下文並驗證
X509_STORE_CTX_init(ctx, store, cert, NULL);
int ret = X509_verify_cert(ctx); // 1 成功,其他失敗
// 4. 錯誤詳情
if (ret != 1) printf("Error: %s\n", X509_verify_cert_error_string(ctx->error));

記憶體洩漏檢測

CRYPTO_malloc_debug_init();
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
// ... 分配操作 ...
BIO *bio = BIO_new_file("leak.log", "w");
CRYPTO_mem_leaks(bio); // 輸出洩漏報告
BIO_free(bio);
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF);

編譯提示

  • OpenSSL 1.1.1+ 需 -lssl -lcrypto,頭檔 <openssl/xxx.h>。
  • 啟用執行緒安全:CRYPTO_set_locking_callback (1.0.x) 或自動 (1.1.1+)。
  • 生產環境務必啟用 SSL_VERIFY_PEER、檢查憑證鏈、主機名驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved