s2n-tls 是 TLS/SSL 協定的 C99 實現,其設計簡單、小型、快速,並以安全性為優先考慮。它根據 Apache License 2.0 發布並獲得許可。
s2n-tls 是「信噪比」的縮寫,是對近乎神奇的加密行為的認可——將有意義的訊號(例如關鍵數據)偽裝成看似隨機的雜訊。
-- s2n-tls 公告
# clone s2n-tls
git clone https://github.com/aws/s2n-tls.git
cd s2n-tls
# install build dependencies
sudo apt update
sudo apt install cmake
# install a libcrypto
sudo apt install libssl-dev
# build s2n-tls
cmake . -Bbuild
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=./s2n-tls-install
cmake --build build -j $( nproc )
CTEST_PARALLEL_LEVEL= $( nproc ) ctest --test-dir build
cmake --install build
有關為您的平台建立 s2n-tls 的進一步指導,請參閱 s2n-tls 建立文件。
如果您認為可能發現了影響安全的問題,請遵循我們的安全通知流程。
如果您對提交 PR、s2n-tls API 使用或類似問題有任何疑問,請提出問題。
s2n-tls 使用 Doxygen 來記錄其公共 API。最新的 s2n-tls 文件可以在 GitHub 頁面上找到。使用指南說明如何設定和使用不同的 TLS 功能。
舊版或 s2n-tls 分支的文檔可以在本地產生。若要產生文檔,請安裝 doxygen 並執行doxygen docs/doxygen/Doxyfile
。現在可以在docs/doxygen/output/html/index.html
找到 doxygen 文件。
Doxygen 安裝說明可在 Doxygen 網頁上找到。
我們列出了兩層的發行版和平台:第一層平台保證在 CI 中建置、運行和通過測試。第 2 層平台保證能夠構建,我們將解決針對它們提出的問題,但它們目前並未在我們的 CI 中運行,並且不會在每次提交時都進行積極審查。如果您使用下面未列出的平台並希望請求(或幫助!)將其添加到我們的 CI,請提出問題進行討論。
CI 中的分佈 | 平台 |
---|---|
Ubuntu18、Ubuntu24** | x86_64 |
Ubuntu22 | x86_64、i686 |
AL2、AL2023** | x86_64、aarch64 |
尼克斯作業系統 | x86_64、aarch64 |
OpenBSD 7.4 | x86_64 |
FreeBSD 最新 | x86_64 |
OSX 最新 | 架構64 |
**正在進行中的工作
分佈不在 CI 中 | 平台 |
---|---|
Fedora 核心 34-36 | x86_64、aarch64 |
Ubuntu14/16/20 | x86_64、aarch64 |
Ubuntu18/22/24 | 架構64 |
作業系統 12-14 | x86_64 |
這些分發清單並不詳盡,缺少工具或缺少受支援的 libcrypto 庫可能會阻止成功建置。
s2n-tls I/O API 的設計對於熟悉廣泛使用的 POSIX I/O API 的開發人員來說是直觀的,並且 s2n-tls 支援阻塞、非阻塞和全雙工 I/O。此外,s2n-tls 中沒有鎖或互斥體。
/* Create a server mode connection handle */
struct s2n_connection * conn = s2n_connection_new ( S2N_SERVER );
if ( conn == NULL ) {
... error ...
}
/* Associate a connection with a file descriptor */
if ( s2n_connection_set_fd ( conn , fd ) < 0 ) {
... error ...
}
/* Negotiate the TLS handshake */
s2n_blocked_status blocked ;
if ( s2n_negotiate ( conn , & blocked ) < 0 ) {
... error ...
}
/* Write data to the connection */
int bytes_written ;
bytes_written = s2n_send ( conn , "Hello World" , sizeof ( "Hello World" ), & blocked );
有關構建 s2n-tls 庫以及如何在您正在開發的應用程式中使用 s2n-tls 的詳細信息,請參閱使用指南。
s2n-tls 實作 SSLv3、TLS1.0、TLS1.1、TLS1.2 和 TLS1.3。對於加密,s2n-tls 支援 CBC 和 GCM 模式下的 128 位元和 256 位元 AES、ChaCha20、3DES 和 RC4。對於前向保密,s2n-tls 支援 DHE 和 ECDHE。 s2n-tls 也支援伺服器名稱指示符 (SNI)、應用層協定協商 (ALPN) 和線上憑證狀態協定 (OCSP) TLS 擴充。出於安全原因,SSLv3、RC4、3DES 和 DHE 預設均處於停用狀態。
由於追蹤最適合使用哪些加密演算法和協定可能很困難,因此 s2n-tls 具有一個簡單的 API 來使用最新的「預設」首選項集。如果您希望保留特定版本以實現向後相容性,那麼也受支援。
/* Use the latest s2n-tls "default" set of ciphersuite and protocol preferences */
s2n_config_set_cipher_preferences ( config , "default" );
/* Use a specific set of preferences, update when you're ready */
s2n_config_set_cipher_preferences ( config , "20150306" )
在內部,s2n-tls 採用系統化的資料保護方法,並包括多種旨在提高安全性的機制。
s2n-tls 的程式碼的結構和編寫重點在於可審查性。所有s2n-tls代碼都要接受代碼審查,我們計劃每年完成s2n-tls的安全評估。
迄今為止,已經對 s2n-tls 進行了兩次外部程式碼級審查,其中一項由商業安全供應商進行。 s2n-tls 也與更廣泛的密碼學、安全性和開源社群的一些值得信賴的成員分享。發現的任何問題始終記錄在 s2n-tls 問題追蹤器中。
除了程式碼審查之外,s2n-tls 還需要接受定期靜態分析、模糊測試和滲透測試。已經進行了多次滲透測試,其中兩次是由商業供應商進行的。
s2n-tls 包括正向和負向單元測試以及端到端測試案例。
可以在此處查看單元測試覆蓋率。請注意,這代表特定建置的單元覆蓋率。由於該版本不一定支援所有 s2n-tls 功能,因此測試覆蓋率可能會被人為降低。
s2n-tls 盡快加密或刪除明文資料。例如,解密的資料緩衝區在被應用程式讀取時被擦除。
s2n-tls 使用作業系統功能來保護資料不被交換到磁碟或出現在核心轉儲中。
s2n-tls 避免實現很少使用的選項和擴展,以及具有觸發協議級漏洞歷史記錄的功能。例如,不支援 DTLS。
TLS 及其相關加密演算法的安全性取決於安全隨機數產生。 s2n-tls 為每個執行緒提供兩個獨立的隨機數產生器。一種用於可能以明文形式出現的「公共」隨機產生的數據,另一種用於應保密的「私人」數據。這種方法減少了隨機數產生演算法因跨上下文洩漏資訊而導致潛在可預測性缺陷的風險。
s2n-tls 的結構使得可以使用不同的加密庫。目前,s2n-tls 支援 AWS-LC、OpenSSL(版本 1.0.2、1.1.1 和 3.0.x)、LibreSSL 和 BoringSSL 來執行底層加密操作。檢查 libcrypto 建置文件以取得 libcrypto 特定功能的清單。
s2n-tls 包括對可能洩漏敏感資料的基於時間的致盲側通道的結構化支援。例如,如果 s2n-tls 無法解析 TLS 記錄或握手訊息,則 s2n-tls 將在回應之前添加 10 到 30 秒之間的隨機延遲(精細到奈秒)。這使得現實世界定時側通道攻擊的複雜性至少提高了數十兆倍。
s2n-tls 使用簡單的表來驅動 TLS/SSL 狀態機,很難出現無效的亂序狀態。
s2n-tls 是用 C 編寫的,但少量使用了標準 C 庫函數,並將所有記憶體處理、字串處理和序列化包裝在系統邊界執行檢查中。
如果您發現 s2n-tls 中存在潛在的安全問題,我們要求您透過我們的漏洞報告頁面通知 AWS 安全部門。請不要創建公共 github 問題。
如果您打包或分發 s2n-tls,或使用 s2n-tls 作為大型多用戶服務的一部分,您可能有資格獲得未來 s2n-tls 版本的預先通知。請聯絡 [email protected]。
如果您有興趣為 s2n-tls 做出貢獻,請參閱我們的開髮指南。
請參閱我們的語言綁定列表,以了解我們所知的 s2n-tls 語言綁定。