s2n-tls — это реализация C99 протоколов TLS/SSL, которая разработана как простая, небольшая, быстрая и с безопасностью в качестве приоритета. Он выпущен и лицензируется по лицензии 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.
Если вы считаете, что обнаружили проблему, влияющую на безопасность, следуйте нашему процессу уведомления о безопасности.
Если у вас есть какие-либо вопросы по поводу отправки запросов на запросы, использования API s2n-tls или чего-то подобного, откройте проблему.
s2n-tls использует Doxygen для документирования своего общедоступного API. Последнюю версию документации s2n-tls можно найти на страницах GitHub. Руководство по использованию объясняет, как можно настроить и использовать различные функции TLS.
Документацию для более старых версий или ветвей s2n-tls можно создать локально. Чтобы создать документацию, установите doxygen и запустите doxygen docs/doxygen/Doxyfile
. Документацию по doxygen теперь можно найти по адресу docs/doxygen/output/html/index.html
.
Инструкции по установке Doxygen доступны на веб-странице Doxygen.
Мы перечислили дистрибутивы и платформы по двум уровням: Платформы уровня 1 гарантированно создают, запускают и проходят тесты в CI. Платформы уровня 2 гарантированно будут созданы, и мы решим проблемы, возникшие с ними, но в настоящее время они не работают в нашей CI и не проверяются активно при каждом коммите. Если вы используете платформу, не указанную ниже, и хотели бы попросить (или помочь!) добавить ее в наш CI, откройте вопрос для обсуждения.
Распространение в CI | Платформы |
---|---|
Убунту18, Убунту24** | x86_64 |
Ubuntu22 | x86_64, i686 |
АЛ2, АЛ2023** | x86_64, аарх64 |
НикОС | x86_64, аарх64 |
OpenBSD 7.4 | x86_64 |
Последняя версия FreeBSD | x86_64 |
последняя версия OS X | aarch64 |
**В работе
Распространение не в CI | Платформы |
---|---|
Ядро Федоры 34-36 | x86_64, аарх64 |
Ubuntu16.14.20 | x86_64, аарх64 |
Ubuntu18/22/24 | aarch64 |
ОС X 12–14 | x86_64 |
Эти списки рассылки не являются исчерпывающими, и отсутствие инструментов или отсутствие поддерживаемой библиотеки libcrypto могут помешать успешной сборке.
API-интерфейсы ввода-вывода s2n-tls разработаны так, чтобы быть интуитивно понятными для разработчиков, знакомых с широко используемыми API-интерфейсами ввода-вывода POSIX, а s2n-tls поддерживает блокирующий, неблокирующий и полнодуплексный ввод-вывод. Кроме того, в 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 поддерживает 128-битный и 256-битный AES в режимах CBC и GCM, ChaCha20, 3DES и RC4. Для обеспечения прямой секретности s2n-tls поддерживает как DHE, так и ECDHE. s2n-tls также поддерживает расширения TLS для индикатора имени сервера (SNI), согласования протокола уровня приложений (ALPN) и протокола статуса онлайн-сертификата (OCSP). 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 в нашем списке языковых привязок.