WolfSSL 嵌入式 SSL/TLS 函式庫
WolfSSL 嵌入式SSL 庫(以前稱為CyaSSL)是一個用ANSI C 編寫的輕量級SSL/TLS 庫,面向嵌入式、RTOS 和資源受限環境- 主要是因為它體積小、速度快且功能集少。由於其免版稅定價和出色的跨平台支持,它也常用於標準操作環境。 WolfSSL 支援高達目前 TLS 1.3 和 DTLS 1.3 的業界標準,比 OpenSSL 小 20 倍,並提供漸進式密碼,例如 ChaCha20、Curve25519、Blake2b 和 Post-Quantum TLS 1.3 組。使用者基準測試和回饋報告顯示,使用 WolfSSL 比 OpenSSL 時的效能顯著提升。
WolfSSL 由 WolfCrypt 加密庫提供支援。 WolfCrypt 的兩個版本已通過 FIPS 140-2 驗證(憑證#2425 和憑證#3389)。 FIPS 140-3 驗證正在進行中。如需更多信息,請訪問 WolfCrypt FIPS 常見問題或聯繫 [email protected]。
為什麼選擇wolfSSL?
選擇 WolfSSL 作為嵌入式、桌面、行動或企業 SSL/TLS 解決方案的原因有很多。一些最重要的原因包括大小(典型的佔用空間大小範圍為20-100 kB)、對最新標準的支援(SSL 3.0、TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3、DTLS 1.0、DTLS 1.2 和DTLS 1.3 ) 、目前和漸進式密碼支援(包括串流密碼)、多平台、免版稅以及 OpenSSL 相容性 API,可輕鬆移植到先前使用 OpenSSL 套件的現有應用程式。有關完整的功能列表,請參閱 WolfSSL 手冊的第 4 章。
注意事項,請閱讀
註1
自 3.6.6 起,wolfSSL 預設不再啟用 SSLv3。 WolfSSL 也不再支援 PSK、RSA 或 ECDH 的靜態金鑰密碼套件。這意味著,如果您打算使用TLS 密碼套件,則必須啟用DH(預設啟用DH)或啟用ECC(預設啟用ECC),或者必須啟用具有下列一項或多項定義的靜態金鑰密碼套件:
WOLFSSL_STATIC_DH
WOLFSSL_STATIC_RSA
WOLFSSL_STATIC_PSK
儘管靜態金鑰密碼套件已被棄用,並將從未來版本的 TLS 中刪除。他們也會透過刪除 PFS 來降低您的安全性。
編譯ssl.c
時,如果沒有可用的密碼套件,wolfSSL 現在將發出編譯器錯誤。如果您希望(即您不使用 TLS 密碼套件),可以透過定義WOLFSSL_ALLOW_NO_SUITES
來消除此錯誤。
註2
WolfSSL 採用與 OpenSSL 不同的憑證驗證方法。客戶端的預設策略是驗證伺服器,這表示如果您不載入 CA 來驗證伺服器,您將收到連線錯誤,沒有簽署者錯誤來確認失敗 (-188)。
如果您想模仿 OpenSSL 的行為,即使驗證伺服器失敗並降低安全性, SSL_connect
也會成功,您可以透過呼叫以下命令來實現:
wolfSSL_CTX_set_verify ( ctx , WOLFSSL_VERIFY_NONE , NULL );
在呼叫wolfSSL_new();
。雖然不推薦。
註3
當使用--enable-opensslextra
( OPENSSL_EXTRA
) 或巨集NO_OLD_SHA_NAMES
WolfSSL 時,枚舉值 SHA、SHA256、SHA384、SHA512 不再可用。這些名稱被映射到 OpenSSL API 以用於單一呼叫雜湊函數。相反,應使用名稱WC_SHA
、 WC_SHA256
、 WC_SHA384
和WC_SHA512
作為枚舉名稱。
WolfSSL 版本 5.7.4(2024 年 10 月 24 日)
版本 5.7.4 是根據 WolfSSL 的開發和 QA 流程(請參閱下面的連結)開發的,並成功通過了品質標準。 https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance
注意:* --enable-heapmath 已被棄用,並將於 2024 年底刪除
PR 代表 Pull Request,PR 引用新增程式碼變更的 GitHub 拉取請求編號。
漏洞
- [低] 啟用 OpenSSL 相容層時,在 X509_STORE_add_cert() 和 X509_STORE_load_locations() 實作中,wolfSSL 中的憑證驗證行為與 OpenSSL 不同。先前,在應用程式明確載入中間憑證的情況下,wolfSSL 僅驗證該中間證書,而不是驗證根 CA。這僅影響直接呼叫 API 的用例,不會影響 TLS 連線。建議直接在應用程式中呼叫 API X509_STORE_add_cert() 或 X509_STORE_load_locations() 的使用者更新所使用的 WolfSSL 版本,或在驗證憑證時對載入到 X509_STORE 中的憑證進行額外的健全性檢查。 (#8087)
PQC TLS 實驗性建構修復
- 當使用啟用後量子演算法的 TLS 時,連接使用的 EC 曲線比商定的要小。建議使用 --enable-experimental 建置並啟用具有 TLS 連線的 PQC 密碼套件的使用者更新所使用的 WolfSSL 版本。感謝丹尼爾·科雷亞的報告。 (#8084)
新增功能
- 為 SHA-256、SHA-512、ChaCha20、Poly1305 和 SHA-3 增加了 RISC-V 64 新的彙編優化(PR 7758,7833,7818,7873,7916)
- 使用 DTLS 1.2 實現對連線 ID (CID) 的支援 (PR 7995)
- 增加對 (DevkitPro)libnds 的支援 (PR 7990)
- 新增 Mosquitto OSP(開源專案)連接埠 (PR 6460)
- 為 init sssd 新增連接埠 (PR 7781)
- 新增 eXosip2 連接埠 (PR 7648)
- 增加對 STM32G4 的支援 (PR 7997)
- 增加對 MAX32665 和 MAX32666 TPU HW 以及 ARM ASM 加密回呼支援的支援 (PR 7777)
- 增加對建置用於 libspdm 的 WolfSSL 的支援 (PR 7869)
- 新增連接埠以與 Nucleus Plus 2.3 (PR 7732) 一起使用
- 最初支援 RFC5755 x509 屬性憑證 (acerts)。使用 --enable-acert 啟用(PR 7926)
- PKCS#11 RSA Padding 卸載允許令牌執行 CKM_RSA_PKCS(簽章/加密)、CKM_RSA_PKCS_PSS(簽章)和 CKM_RSA_PKCS_OAEP(加密)。 (公關7750)
- 新增了“新”和“刪除”樣式函數,用於堆/池分配和釋放低階加密結構(PR 3166 和 8089)
增強和優化
- 增加預設最大替代值。名稱從 128 到 1024 (PR 7762)
- 新增了新的恆定時間 DH 同意函數 wc_DhAgree_ct (PR 7802)
- 擴展了 API EVP_PKEY_is_a 的兼容性層 (PR 7804)
- 新增選項以使用 --disable-cryptocb-sw-test 停用 cryptocb 測試軟體測試 (PR 7862)
- 在檢查憑證日期之前新增對憑證驗證回呼的呼叫 (PR 7895)
- WolfCrypt CSharp 包裝器支援擴展演算法。增加對 RNG、ECC(ECIES 和 ECDHE)、RSA、ED25519/Curve25519、AES-GCM 和哈希的支持 (PR 3166)
- 擴展 MMCAU 支援以與 DES ECB 一起使用 (PR 7960)
- 更新 AES SIV 以處理多個關聯的資料輸入 (PR 7911)
- 從 --enable-openssh 中刪除 HAVE_NULL_CIPHER (PR 7811)
- 在呼叫 XFREE 時刪除了重複的 if(NULL) 檢查(巨集執行)(PR 7839)
- 將 RSA_MIN_SIZE 預設為 2048 位元 (PR 7923)
- 新增了對 WolfSSL 的支持,以用作 zephyr 內核中的預設 TLS(PR 7731)
- 使用 --enable-wolfprovider 和 autotools 新增啟用提供者建置 (PR 7550)
- 瑞薩電子 RX TSIP ECDSA 支持 (PR 7685)
- 伺服器支援CID時支援DTLS1.3降級(PR 7841)
- 伺服器端檢查 OCSP,即使它使用 v2 multi (PR 7828)
- 在 PKCS7 套件解析和建立中加入對缺少的雜湊參數的處理 (PR 7845)
- 為 Poly1305 增加 w64wrapper 的使用,使 Poly1305 能夠在沒有 word64 類型的環境中使用 (PR 7759)
- 更新 maxq10xx 支援 (PR 7824)
- 新增對解析可選 PKCS8 屬性的支援 (PR 7944)
- 使用 DTLS 1.3 增加對任一方方法的支持 (PR 8012)
- 新增了 PKCS7 PEM 支持,用於使用 BEGIN/END PKCS7 解析 PEM 數據(PR 7704)
- 新增 WOLFSSL_CUSTOM_CURVES 的 CMake 支援 (PR 7962)
- 在 X509_check_host() 中新增最左側通配符匹配支援 (PR 7966)
- 新增選項以透過 PKCS7 捆綁包建立設定自訂 SKID (PR 7954)
- 使用 Ada 建立 WolfSSL 作為庫並修正 Alire 清單 (PR 7303,7940)
- 瑞薩電子 RX72N 支援更新 (PR 7849)
- 新增了新選項 WOLFSSL_COPY_KEY 以始終將金鑰複製到 SSL 物件 (PR 8005)
- 新增選項 WOLFSSL_COPY_CERT 以始終複製每個 SSL 物件的憑證緩衝區 (PR 7867)
- 新增一個選項以將 AES-CBC 與 HMAC 結合使用作為預設會話票證 enc/dec。預設為 AES-128-CBC 和 HMAC-SHA256 (PR 7703)
- wc_PRF、sha256(適用於許多暫存器可用時的小程式碼)和 sp_int 物件中的記憶體使用改進 (PR 7901)
- 更改配置腳本以在不使用命令的情況下解決“>>”問題。在較舊的 /bin/sh 中,它可能不明確,如 FreeBSD 9.2 (PR 7876) 等作業系統中所使用的那樣
- 不需要時不要嘗試包含系統標頭 (PR 7813)
- 憑證:ECC 簽章演算法參數的 DER 編碼現在允許透過定義為 NULL (PR 7903)
- SP x86_64 asm:檢查虛擬機器的 AVX2 支援 (PR 7979)
- 更新 gr-rose 上的 rx64n 支持 (PR 7889)
- 將 RA6M4 的 FSP 版本更新至 v5.4.0 (PR 7994)
- 將 RX65N RSK 的 TSIP 驅動程式版本更新至 v1.21 (PR 7993)
- 為具有填充的 RSA 新增新的加密回呼(PR 7907)
- 將 pqm4 的使用替換為 Kyber/MLDSA 的 WolfSSL 實作(PR 7924)
- 對 C11 和 clang 的現代化記憶體柵欄支援 (PR 7938)
- 新增 CRL 錯誤覆蓋回調 (PR 7986)
- 擴展 X509 未知擴展回呼以與使用者上下文一起使用 (PR 7730)
- 使用 TLS 新增了額外的偵錯錯誤追蹤 (PR 7917)
- 使用 libbacktrace 新增了對庫呼叫堆疊追蹤的執行時間支援 –enable-debug-trace-errcodes=backtrace (PR 7846)
- 擴展的 C89 合規性 (PR 8077)
- 擴展了對 WOLFSSL_NO_MALLOC 的支援(PR 8065)
- 新增了對 Linux 核心模組交叉編譯的支援 (PR 7746)
- 更新了 Linux 核心模組,支援核心 6.11 和 6.12 (PR 7826)
- 引入 WOLFSSL_ASN_ALLOW_0_SERIAL 以允許解析序號為 0 的憑證 (PR 7893)
- 將條件repository_owner加入所有wolfSSL GitHub工作流程(PR 7871)
樂鑫 / Arduino 更新
- 更新 Espressif ESP-IDF 的 Wolfcrypt settings.h,範本更新(PR 7953)
- 更新 Espressif sha、util、mem、時間助手 (PR 7955)
- Espressif _thread_local_start 和 _thread_local_end 修復(PR 8030)
- 改進樂鑫設備的基準測試 (PR 8037)
- 引入 Espressif 常用 CONFIG_WOLFSSL_EXAMPLE_NAME、Kconfig (PR 7866)
- 新增對 Espressif ESP-IDF 的 WolfSSL esp-tls 和憑證捆綁支援 (PR 7936)
- 更新 Arduino 的 Wolfssl 版本 (PR 7775)
後量子加密更新
- Dilithium:支援 dilithium_key 中的固定大小數組(PR 7727)
- Dilithium:新增使用小符號的預計算選項(PR 7744)
- 允許使用 FIPS 建構 Kyber (PR 7788)
- 允許在 Linux 核心模組中使用 Kyber asm (PR 7872)
- Dilithium、Kyber:更新至最終規範 (PR 7877)
- Dilithium:支持 FIPS 204 草案和最終草案 (PR 7909,8016)
ARM 彙編優化
- 為 ChaCha20 和 Poly1305 新增了 ARM32 彙編優化 (PR 8020)
- 針對 Aarch64 的 Poly1305 組裝最佳化改進 (PR 7859)
- 為 Thumb-2 增加了 Poly1305 組裝優化 (PR 7939)
- 將 ARM ASM 建置選項新增至 STM32CubePack (PR 7747)
- 將 ARM64 新增至 Visual Studio 專案 (PR 8010)
- 針對 ARM32 和 Aarch64 的 Kyber 程式集最佳化(PR 8040,7998)
- 針對 ARMv7E-M/ARMv7-M 的 Kyber 組件最佳化 (PR 7706)
修復
- ECC 金鑰載入:修復了參數不是預設大小的憑證 (PR 7751)
- 修正了在 Visual Studio 中為非 Windows 作業系統建置 x86 的問題 (PR 7884)
- 修正了 TLS v1.2 秘密回呼,錯誤地偵測到錯誤的主秘密 (PR 7812)
- 修正了 PowerPC 程序集與 Darwin 和 SP math all 一起使用的問題 (PR 7931)
- 修正了嘗試連結 libdispatch 時檢測舊版 Mac OS 的問題(PR 7932)
- 修正了當伺服器發送多個握手資料包合併為一次傳輸時 DTLS1.3 降級到 DTLS1.2 的問題。 (公關7840)
- 修正了 OCSP 保存請求(如果請求儲存在 ssl->ctx->certOcspRequest 中)的問題 (PR 7779)
- 修復了 OCSP 以透過金鑰哈希而不是分機搜尋 CA。密鑰 ID(PR 7934)
- 修復靜態記憶體和單線程建置 (PR 7737)
- 修復不允許 Shake128/256 與 Xilinx AFALG (PR 7708)
- 修復以支援 PKCS11,無需產生 RSA 金鑰 (PR 7738)
- 修正使用 PK 回呼 + TLS 1.3 時不呼叫簽章回呼的問題 (PR 7761)
- IAR 編譯器的 Cortex-M/Thumb2 ASM 修復標籤 (PR 7753)
- 修復 PKCS11 以正確迭代 slotId (PR 7736)
- 停止剝離 AltSigAlg 擴展上的序列標頭 (PR 7710)
- 使用 ASN 範本修復 ParseCRL_AuthKeyIdExt 以設定 extAuthKeyIdSet 值 (PR 7742)
- 使用 PSK 加密緩衝區大小的最大金鑰長度 (PR 7707)
- DTLS 1.3 修復了大小檢查,包括標頭和 CID 修復 (PR 7912,7951)
- 修復 STM32 哈希 FIFO 並添加對 STM32U5A9xx 的支援 (PR 7787)
- 修復curl 建置的 CMake 建置錯誤 (PR 8021)
- SP 數學:PowerPC ASM 修復為使用 XOR 而非 LI (PR 8038)
- 金鑰/憑證的 SSL 載入:測試和修復 (PR 7789)
- 雜項。針對 Dilithium 和 Kyber 的修復(PR 7721,7765,7803,8027,7904)
- 修正了為 PQ LMS/XMSS 建置 WolfBoot 來源的問題 (PR 7868)
- 修正了使用 CMake 和 zephyr 連接埠啟用 Kyber 進行建置的問題 (PR 7773)
- 修正了使用 TLS 1.2 恢復會話的邊緣情況 (PR 8097)
- 修正 ARM ASM 與 AES CFB/OFB 未初始化「左」成員的問題 (PR 8099)
有關其他漏洞信息,請訪問漏洞頁面:https://www.wolfssl.com/docs/security-vulnerability/
有關建置說明,請參閱安裝檔。更多資訊可以在線找到:https://wolfssl.com/wolfSSL/Docs.html
資源
狼SSL網站
狼SSL 維基
FIPS 140-2/140-3 常見問題解答
狼SSL文檔
狼SSL手冊
WolfSSL API 參考
WolfCrypt API 參考
傳輸層安全協定1.3
WolfSSL 漏洞
其他 WolfSSL 範例
目錄結構
├── certs [Certificates used in tests and examples]
├── cmake [Cmake build utilities]
├── debian [Debian packaging files]
├── doc [Documentation for wolfSSL (Doxygen)]
├── Docker [Prebuilt Docker environments]
├── examples [wolfSSL examples]
│ ├── asn1 [ASN.1 printing example]
│ ├── async [Asynchronous Cryptography example]
│ ├── benchmark [TLS benchmark example]
│ ├── client [Client example]
│ ├── configs [Example build configurations]
│ ├── echoclient [Echoclient example]
│ ├── echoserver [Echoserver example]
│ ├── pem [Example for convert between PEM and DER]
│ ├── sctp [Servers and clients that demonstrate wolfSSL's DTLS-SCTP support]
│ └── server [Server example]
├── IDE [Contains example projects for various development environments]
├── linuxkm [Linux Kernel Module implementation]
├── m4 [Autotools utilities]
├── mcapi [wolfSSL MPLAB X Project Files]
├── mplabx [wolfSSL MPLAB X Project Files]
├── mqx [wolfSSL Freescale CodeWarrior Project Files]
├── rpm [RPM packaging metadata]
├── RTOS
│ └── nuttx [Port of wolfSSL for NuttX]
├── scripts [Testing scripts]
├── src [wolfSSL source code]
├── sslSniffer [wolfSSL sniffer can be used to passively sniff SSL traffic]
├── support [Contains the pkg-config file]
├── tests [Unit and configuration testing]
├── testsuite [Test application that orchestrates tests]
├── tirtos [Port of wolfSSL for TI RTOS]
├── wolfcrypt [The wolfCrypt component]
│ ├── benchmark [Cryptography benchmarking application]
│ ├── src [wolfCrypt source code]
│ │ └── port [Supported hardware acceleration ports]
│ └── test [Cryptography testing application]
├── wolfssl [Header files]
│ ├── openssl [Compatibility layer headers]
│ └── wolfcrypt [Header files]
├── wrapper [wolfSSL language wrappers]
└── zephyr [Port of wolfSSL for Zephyr RTOS]