s2n-tls es una implementación C99 de los protocolos TLS/SSL que está diseñada para ser simple, pequeña, rápida y con la seguridad como prioridad. Se publica y tiene la licencia Apache License 2.0.
s2n-tls es la abreviatura de "señal a ruido" y es un guiño al acto casi mágico del cifrado: disfrazar señales significativas, como sus datos críticos, como ruido aparentemente aleatorio.
-- anuncio 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
Consulte la documentación de compilación de s2n-tls para obtener más orientación sobre cómo crear s2n-tls para su plataforma.
Si cree que ha encontrado un problema que afecta la seguridad, siga nuestro Proceso de notificación de seguridad.
Si tiene alguna pregunta sobre el envío de relaciones públicas, el uso de la API s2n-tls o algo similar, abra un problema.
s2n-tls utiliza Doxygen para documentar su API pública. La documentación más reciente de s2n-tls se puede encontrar en las páginas de GitHub. La Guía de uso explica cómo se pueden configurar y utilizar las diferentes funciones de TLS.
La documentación para versiones anteriores o ramas de s2n-tls se puede generar localmente. Para generar la documentación, instale doxygen y ejecute doxygen docs/doxygen/Doxyfile
. La documentación de doxygen ahora se puede encontrar en docs/doxygen/output/html/index.html
.
Las instrucciones de instalación de Doxygen están disponibles en la página web de Doxygen.
Hemos enumerado las distribuciones y plataformas en dos niveles: Se garantiza que las plataformas de nivel 1 crearán, ejecutarán y aprobarán pruebas en CI. Se garantiza que las plataformas de nivel 2 se construirán y abordaremos los problemas que se presenten contra ellas, pero actualmente no se están ejecutando en nuestro CI y no se revisan activamente con cada confirmación. Si utiliza una plataforma que no figura en la lista a continuación y desea solicitar (¡o ayudar!) agregarla a nuestro CI, abra un problema para discusión.
Distribución en CI | Plataformas |
---|---|
Ubuntu18, Ubuntu24** | x86_64 |
ubuntu22 | x86_64, i686 |
AL2, AL2023** | x86_64, aarch64 |
NixOS | x86_64, aarch64 |
OpenBSD 7.4 | x86_64 |
FreeBSD más reciente | x86_64 |
OSX más reciente | aarch64 |
**Trabajo en progreso
Distribución no en CI | Plataformas |
---|---|
Fedora Núcleo 34-36 | x86_64, aarch64 |
Ubuntu14/16/20 | x86_64, aarch64 |
ubuntu18/22/24 | aarch64 |
OSX 12-14 | x86_64 |
Estas listas de distribución no son exhaustivas y la falta de herramientas o de una biblioteca libcrypto compatible podría impedir una compilación exitosa.
Las API de E/S de s2n-tls están diseñadas para ser intuitivas para los desarrolladores familiarizados con las API de E/S POSIX ampliamente utilizadas, y s2n-tls admite E/S con bloqueo, sin bloqueo y dúplex completo. Además, no hay bloqueos ni mutex dentro de 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 );
Para obtener detalles sobre cómo crear la biblioteca s2n-tls y cómo usar s2n-tls en una aplicación que esté desarrollando, consulte la Guía de uso.
s2n-tls implementa SSLv3, TLS1.0, TLS1.1, TLS1.2 y TLS1.3. Para el cifrado, s2n-tls admite AES de 128 y 256 bits en los modos CBC y GCM, ChaCha20, 3DES y RC4. Para el secreto directo, s2n-tls admite tanto DHE como ECDHE. s2n-tls también admite las extensiones TLS Indicador de nombre de servidor (SNI), Negociación de protocolo de capa de aplicación (ALPN) y Protocolo de estado de certificado en línea (OCSP). SSLv3, RC4, 3DES y DHE están deshabilitados de forma predeterminada por razones de seguridad.
Como puede resultar difícil realizar un seguimiento de qué algoritmos y protocolos de cifrado son mejores para usar, s2n-tls presenta una API simple para usar el último conjunto de preferencias "predeterminadas". Si prefiere permanecer en una versión específica para compatibilidad con versiones anteriores, también es compatible.
/* 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" )
Internamente, s2n-tls adopta un enfoque sistemático para la protección de datos e incluye varios mecanismos diseñados para mejorar la seguridad.
El código de s2n-tls está estructurado y escrito centrándose en la revisabilidad. Todo el código de s2n-tls está sujeto a revisión de código y planeamos completar evaluaciones de seguridad de s2n-tls anualmente.
Hasta la fecha ha habido dos revisiones externas a nivel de código de s2n-tls, incluida una realizada por un proveedor de seguridad comercial. s2n-tls también se ha compartido con algunos miembros confiables de las comunidades más amplias de criptografía, seguridad y código abierto. Cualquier problema descubierto siempre se registra en el rastreador de problemas de s2n-tls.
Además de las revisiones de código, s2n-tls está sujeto a análisis estáticos, pruebas de fuzz y pruebas de penetración periódicas. Se han realizado varias pruebas de penetración, incluidas dos realizadas por proveedores comerciales.
s2n-tls incluye pruebas unitarias positivas y negativas y casos de prueba de un extremo a otro.
La cobertura de la prueba unitaria se puede ver aquí. Tenga en cuenta que esto representa la cobertura de unidades para una construcción en particular. Dado que esa compilación no necesariamente admitirá todas las funciones de s2n-tls, la cobertura de la prueba puede reducirse artificialmente.
s2n-tls cifra o borra datos de texto plano lo más rápido posible. Por ejemplo, los buffers de datos descifrados se borran a medida que la aplicación los lee.
s2n-tls utiliza funciones del sistema operativo para proteger los datos para que no se intercambien al disco o aparezcan en volcados de núcleo.
s2n-tls evita implementar opciones y extensiones poco utilizadas, así como funciones con un historial de activación de vulnerabilidades a nivel de protocolo. Por ejemplo, no hay soporte para DTLS.
La seguridad de TLS y sus algoritmos de cifrado asociados depende de la generación segura de números aleatorios. s2n-tls proporciona a cada hilo dos generadores de números aleatorios separados. Uno para datos "públicos" generados aleatoriamente que pueden aparecer sin cifrar y otro para datos "privados" que deben permanecer secretos. Este enfoque reduce el riesgo de posibles debilidades de previsibilidad en los algoritmos de generación de números aleatorios debido a la filtración de información entre contextos.
s2n-tls se ha estructurado para que se puedan utilizar diferentes bibliotecas de cifrado. Hoy en día, s2n-tls admite AWS-LC, OpenSSL (versiones 1.0.2, 1.1.1 y 3.0.x), LibreSSL y BoringSSL para realizar las operaciones criptográficas subyacentes. Consulte la documentación de compilación de libcrypto para obtener una lista de características específicas de libcrypto.
s2n-tls incluye soporte estructurado para cegar canales laterales basados en tiempo que pueden filtrar datos confidenciales. Por ejemplo, si s2n-tls no puede analizar un registro TLS o un mensaje de protocolo de enlace, s2n-tls agregará un retraso aleatorio de entre 10 y 30 segundos, granular a nanosegundos, antes de responder. Esto aumenta la complejidad de los ataques de canal lateral en el mundo real en un factor de al menos decenas de billones.
s2n-tls utiliza tablas simples para controlar las máquinas de estado TLS/SSL, lo que dificulta que surjan estados desordenados no válidos.
s2n-tls está escrito en C, pero hace un uso ligero de las funciones estándar de la biblioteca de C y envuelve todo el manejo de memoria, el manejo de cadenas y la serialización en comprobaciones sistemáticas de cumplimiento de límites.
Si descubre un posible problema de seguridad en s2n-tls, le solicitamos que notifique a AWS Security a través de nuestra página de informes de vulnerabilidad. No cree un problema público de github.
Si empaqueta o distribuye s2n-tls, o utiliza s2n-tls como parte de un gran servicio multiusuario, puede ser elegible para recibir notificaciones previas de futuras versiones de s2n-tls. Comuníquese con [email protected].
Si está interesado en contribuir a s2n-tls, consulte nuestra guía de desarrollo.
Consulte nuestra lista de enlaces de idiomas para conocer los enlaces de idiomas para s2n-tls que conocemos.