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 语言绑定。