aws/s2n-tls

GitHub: aws/s2n-tls

AWS 开源的轻量级 TLS/SSL 协议 C99 实现,以安全审计性和抗侧信道攻击为核心设计目标。

Stars: 4696 | Forks: 765

s2n s2n-tls 是 TLS/SSL 协议的 C99 实现,旨在做到简单、小巧、快速,并将安全性作为首要任务。它根据 Apache License 2.0 发布并授权。 [![Build Status](https://codebuild.us-west-2.amazonaws.com/badges?uuid=eyJlbmNyeXB0ZWREYXRhIjoiMndlTzJNbHVxWEo3Nm82alp4eGdGNm4rTWdxZDVYU2VTbitIR0ZLbHVtcFFGOW5majk5QnhqaUp3ZEkydG1ueWg0NGlhRE43a1ZnUzZaQTVnSm91TzFFPSIsIml2UGFyYW1ldGVyU3BlYyI6IlJLbW42NENlYXhJNy80QnYiLCJtYXRlcmlhbFNldFNlcmlhbCI6MX0%3D&branch=main)](https://github.com/aws/s2n-tls/) [![Apache 2 License](https://img.shields.io/github/license/aws/s2n-tls.svg)](http://aws.amazon.com/apache-2-0/) [![C99](https://img.shields.io/badge/language-C99-blue.svg)](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) [![Github forks](https://img.shields.io/github/forks/aws/s2n-tls.svg)](https://github.com/aws/s2n-tls/network) [![Github stars](https://img.shields.io/github/stars/aws/s2n-tls.svg)](https://github.com/aws/s2n-tls/stargazers) ## Ubuntu 快速入门 ``` # 克隆 s2n-tls git clone https://github.com/aws/s2n-tls.git cd s2n-tls # 安装构建依赖 sudo apt update sudo apt install cmake # 安装 libcrypto sudo apt install libssl-dev # 构建 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 构建文档](docs/BUILD.md)。 ## 有疑问? 如果您认为自己可能发现了影响安全的问题,请遵循我们的 [安全通知流程](#security-issue-notifications)。有关我们的威胁模型中被认为在范围内的问题的额外指导,请参阅我们的 [安全报告策略](./SECURITY.md)。 如果您对提交 PR、s2n-tls API 使用或类似问题有任何疑问,请提交 issue。 ## 文档 s2n-tls 使用 [Doxygen](https://doxygen.nl/index.html) 来记录其公共 API。最新的 s2n-tls 文档可以在 [GitHub pages](https://aws.github.io/s2n-tls/doxygen/) 上找到。[使用指南](https://aws.github.io/s2n-tls/usage-guide/) 解释了如何配置和使用不同的 TLS 功能。s2n-tls Rust bindings 文档可以在 [这里](https://docs.rs/s2n-tls/latest/s2n_tls/) 找到。 旧版本或 s2n-tls 分支的文档可以在本地生成。要生成文档,请安装 doxygen 并运行 `doxygen docs/doxygen/Doxyfile`。Doxygen 文档现在可以在 `docs/doxygen/output/html/index.html` 找到。 Doxygen 安装说明可在 [Doxygen](https://doxygen.nl/download.html) 网页上找到。 ## 平台支持 我们将发行版和平台分为两个层级:Tier 1 平台保证能够在 CI 中构建、运行并通过测试。Tier 2 平台保证能够构建,我们会解决针对它们提出的问题,但它们目前未在我们的 CI 中运行,也不会在每次提交时进行主动审查。如果您使用下面未列出的平台,并希望请求将其添加到我们的 CI 中(或提供帮助!),请提交 issue 进行讨论。 ### Tier 1 |CI 中的发行版 |平台 | |-------------------------------------------------------|-----------------| |Ubuntu18, Ubuntu24** | x86_64 | |Ubuntu22 | x86_64, i686 | |AL2, AL2023** | x86_64, aarch64 | |NixOS | x86_64, aarch64 | |OpenBSD [7.4](https://github.com/cross-platform-actions/action/blob/master/readme.md#supported-platforms)| x86_64 | |FreeBSD [最新版](https://github.com/vmactions/freebsd-vm/blob/v1/conf/default.release.conf)| x86_64 | |OSX [最新版](https://github.com/actions/runner-images?tab=readme-ov-file#available-images) | aarch64 | **正在进行中 ### Tier 2 |不在 CI 中的发行版 |平台| |-----------------------|---------| | Fedora Core 34-36 | x86_64, aarch64 | | Ubuntu14/16/20 | x86_64, aarch64 | | Ubuntu18/22/24 | aarch64 | | [OSX](https://github.com/actions/runner-images/tree/main/images/macos) 12-14 |x86_64| 这些发行版列表并非详尽无遗,缺少工具或缺少受支持的 libcrypto 库可能会导致构建失败。 ## 使用 s2n-tls 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 的详细信息,请参阅 [使用指南](https://aws.github.io/s2n-tls/usage-guide)。 ## 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 issue 跟踪器中。 ##### 静态分析、模糊测试和渗透测试 除了代码审查外,s2n-tls 还接受定期的静态分析、模糊测试和渗透测试。已经进行了多次渗透测试,其中包括两次由商业供应商进行的测试。 ##### 单元测试和端到端测试 s2n-tls 包含正向和负向单元测试以及端到端测试用例。 单元测试覆盖率可以在 [这里](https://dx1inn44oyl7n.cloudfront.net/main/index.html) 查看。请注意,这代表特定构建的单元覆盖率。由于该构建不一定支持所有 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 构建文档](docs/BUILD.md#building-with-a-specific-libcrypto) 以获取特定于 libcrypto 的功能列表。 ##### 时间盲化 s2n-tls 包含针对可能泄露敏感数据的基于时间的侧信道的结构化盲化支持。例如,如果 s2n-tls 无法解析 TLS 记录或握手消息,s2n-tls 将在响应之前添加 10 到 30 秒之间的随机延迟(精确到纳秒)。这将现实世界中的时序侧信道攻击的复杂性至少提高了数万亿倍。 ##### 基于表的状态机 s2n-tls 使用简单的表来驱动 TLS/SSL 状态机,使得很难出现无效的乱序状态。 ##### C 安全性 s2n-tls 是用 C 语言编写的,但仅轻度使用标准 C 库函数,并将所有内存处理、字符串处理和序列化封装在系统的边界强制检查中。 ## 安全问题通知 如果您在 s2n-tls 中发现潜在的安全问题,我们要求您通过我们的 [漏洞报告页面](http://aws.amazon.com/security/vulnerability-reporting/) 通知 AWS Security。请**不要**创建公开的 github issue。 如果您打包或分发 s2n-tls,或将 s2n-tls 作为大型多用户服务的一部分使用,您可能有资格获得未来 s2n-tls 版本的预通知。请联系 s2n-pre-notification@amazon.com。 有关我们的威胁模型中被认为在范围内的问题的额外指导,请参阅我们的 [安全报告策略](./SECURITY.md)。 ## 为 s2n-tls 做贡献 如果您有兴趣为 s2n-tls 做贡献,请参阅我们的 [开发指南](https://github.com/aws/s2n-tls/blob/main/docs/DEVELOPMENT-GUIDE.md)。 ## s2n-tls 的语言绑定 请参阅我们的 [语言绑定列表](https://github.com/aws/s2n-tls/blob/main/docs/BINDINGS.md),了解我们已知的 s2n-tls 语言绑定。
标签:AWS, Bash脚本, C99, DPI, OpenSSL, s2n, SSL, TLS, 加密库, 协议实现, 可视化界面, 安全测试工具, 安全通信, 客户端加密, 密码学, 开源, 手动系统调用, 系统底层, 网络安全, 通信安全, 防御工具, 隐私保护