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.5 | BIO (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 |
| 11 | CRL 憑證撤銷列表 | X509_CRL_new, X509_CRL_sign, X509_CRL_print |
| 12 | 憑證驗證鏈 | X509_STORE, X509_STORE_CTX, X509_verify_cert |
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);
-lssl -lcrypto,頭檔 <openssl/xxx.h>。CRYPTO_set_locking_callback (1.0.x) 或自動 (1.1.1+)。SSL_VERIFY_PEER、檢查憑證鏈、主機名驗證。