s2n-tls est une implémentation C99 des protocoles TLS/SSL conçue pour être simple, petite, rapide et avec la sécurité comme priorité. Il est publié et sous licence Apache License 2.0.
s2n-tls est l'abréviation de « signal sur bruit » et est un clin d'œil à l'acte presque magique du cryptage : déguiser des signaux significatifs, comme vos données critiques, en un bruit apparemment aléatoire.
-- annonce 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
Consultez la documentation de construction de s2n-tls pour obtenir des conseils supplémentaires sur la création de s2n-tls pour votre plate-forme.
Si vous pensez avoir découvert un problème ayant un impact sur la sécurité, veuillez suivre notre processus de notification de sécurité.
Si vous avez des questions sur la soumission de PR, l'utilisation de l'API s2n-tls ou quelque chose de similaire, veuillez ouvrir un problème.
s2n-tls utilise Doxygen pour documenter son API publique. La dernière documentation s2n-tls est disponible sur les pages GitHub. Le Guide d'utilisation explique comment différentes fonctionnalités TLS peuvent être configurées et utilisées.
La documentation des anciennes versions ou branches de s2n-tls peut être générée localement. Pour générer la documentation, installez doxygen et exécutez doxygen docs/doxygen/Doxyfile
. La documentation de doxygen peut désormais être trouvée sur docs/doxygen/output/html/index.html
.
Les instructions d'installation de Doxygen sont disponibles sur la page Web de Doxygen.
Nous avons répertorié les distributions et les plates-formes sous deux niveaux : Les plates-formes de niveau 1 sont garanties pour créer, exécuter et réussir les tests dans CI. La construction des plates-formes de niveau 2 est garantie et nous résoudrons les problèmes ouverts à leur encontre, mais elles ne fonctionnent pas actuellement dans notre CI et ne sont pas activement examinées à chaque validation. Si vous utilisez une plateforme non répertoriée ci-dessous et que vous souhaitez demander (ou aider !) de l'ajouter à notre CI, veuillez ouvrir un problème pour discussion.
Répartition en CI | Plateformes |
---|---|
Ubuntu18, Ubuntu24** | x86_64 |
Ubuntu22 | x86_64, i686 |
AL2, AL2023** | x86_64, aarch64 |
NixOS | x86_64, aarch64 |
OpenBSD 7.4 | x86_64 |
FreeBSD le plus récent | x86_64 |
OSX le plus récent | aarch64 |
**Travaux en cours
Distribution hors CI | Plateformes |
---|---|
Fedora Core 34-36 | x86_64, aarch64 |
Ubuntu16/14/20 | x86_64, aarch64 |
Ubuntu18/22/24 | aarch64 |
OSX12-14 | x86_64 |
Ces listes de distribution ne sont pas exhaustives et des outils manquants ou une bibliothèque libcrypto prise en charge manquante pourraient empêcher une construction réussie.
Les API d'E/S s2n-tls sont conçues pour être intuitives pour les développeurs familiarisés avec les API d'E/S POSIX largement utilisées, et s2n-tls prend en charge les E/S bloquantes, non bloquantes et en duplex intégral. De plus, il n'y a pas de verrous ou de mutex dans 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 );
Pour plus de détails sur la création de la bibliothèque s2n-tls et sur la manière d'utiliser s2n-tls dans une application que vous développez, consultez le Guide d'utilisation.
s2n-tls implémente SSLv3, TLS1.0, TLS1.1, TLS1.2 et TLS1.3. Pour le cryptage, s2n-tls prend en charge AES 128 bits et 256 bits dans les modes CBC et GCM, ChaCha20, 3DES et RC4. Pour la confidentialité transmise, s2n-tls prend en charge à la fois DHE et ECDHE. s2n-tls prend également en charge les extensions TLS de l'indicateur de nom de serveur (SNI), de la négociation de protocole de couche d'application (ALPN) et du protocole d'état de certificat en ligne (OCSP). SSLv3, RC4, 3DES et DHE sont chacun désactivés par défaut pour des raisons de sécurité.
Comme il peut être difficile de savoir quels algorithmes et protocoles de chiffrement sont les meilleurs à utiliser, s2n-tls propose une API simple pour utiliser le dernier ensemble de préférences « par défaut ». Si vous préférez rester sur une version spécifique pour des raisons de compatibilité ascendante, celle-ci est également prise en charge.
/* 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" )
En interne, s2n-tls adopte une approche systématique de la protection des données et comprend plusieurs mécanismes conçus pour améliorer la sécurité.
Le code de s2n-tls est structuré et écrit en mettant l'accent sur la possibilité de révision. Tout le code s2n-tls est soumis à une révision du code et nous prévoyons de réaliser des évaluations de sécurité de s2n-tls sur une base annuelle.
À ce jour, il y a eu deux examens externes au niveau du code de s2n-tls, dont un par un fournisseur de sécurité commercial. s2n-tls a également été partagé avec certains membres de confiance des communautés plus larges de cryptographie, de sécurité et Open Source. Tous les problèmes découverts sont toujours enregistrés dans le suivi des problèmes s2n-tls.
En plus des révisions de code, s2n-tls est soumis régulièrement à des analyses statiques, des tests de fuzz et des tests d'intrusion. Plusieurs tests d'intrusion ont été effectués, dont deux réalisés par des fournisseurs commerciaux.
s2n-tls comprend des tests unitaires positifs et négatifs et des cas de test de bout en bout.
La couverture des tests unitaires peut être consultée ici. Notez que cela représente la couverture unitaire pour une version particulière. Étant donné que cette version ne prendra pas nécessairement en charge toutes les fonctionnalités de s2n-tls, la couverture des tests peut être artificiellement réduite.
s2n-tls crypte ou efface les données en clair aussi rapidement que possible. Par exemple, les tampons de données déchiffrées sont effacés au fur et à mesure de leur lecture par l'application.
s2n-tls utilise les fonctionnalités du système d'exploitation pour empêcher les données d'être échangées sur le disque ou d'apparaître dans les core dumps.
s2n-tls évite d'implémenter des options et des extensions rarement utilisées, ainsi que des fonctionnalités ayant un historique de déclenchement de vulnérabilités au niveau du protocole. Par exemple, DTLS n'est pas pris en charge.
La sécurité de TLS et de ses algorithmes de chiffrement associés dépend de la génération sécurisée de nombres aléatoires. s2n-tls fournit à chaque thread deux générateurs de nombres aléatoires distincts. Un pour les données « publiques » générées aléatoirement qui peuvent apparaître en clair, et un pour les données « privées » qui doivent rester secrètes. Cette approche réduit le risque de faiblesses potentielles de prévisibilité dans les algorithmes de génération de nombres aléatoires dues à des fuites d'informations à travers les contextes.
s2n-tls a été structuré de manière à ce que différentes bibliothèques de chiffrement puissent être utilisées. Aujourd'hui, s2n-tls prend en charge AWS-LC, OpenSSL (versions 1.0.2, 1.1.1 et 3.0.x), LibreSSL et BoringSSL pour effectuer les opérations cryptographiques sous-jacentes. Consultez la documentation de build de libcrypto pour une liste des fonctionnalités spécifiques à libcrypto.
s2n-tls inclut une prise en charge structurée pour les canaux secondaires temporels aveugles susceptibles de divulguer des données sensibles. Par exemple, si s2n-tls ne parvient pas à analyser un enregistrement TLS ou un message de prise de contact, s2n-tls ajoutera un délai aléatoire compris entre 10 et 30 secondes, granulaire en nanosecondes, avant de répondre. Cela augmente la complexité des attaques par canal secondaire de synchronisation dans le monde réel d'un facteur d'au moins des dizaines de milliards.
s2n-tls utilise des tables simples pour piloter les machines à états TLS/SSL, ce qui rend difficile l'apparition d'états non valides dans le désordre.
s2n-tls est écrit en C, mais utilise légèrement les fonctions standard de la bibliothèque C et englobe toute la gestion de la mémoire, la gestion des chaînes et la sérialisation dans des contrôles systématiques de respect des limites.
Si vous découvrez un problème de sécurité potentiel dans s2n-tls, nous vous demandons d'en informer AWS Security via notre page de rapport de vulnérabilité. Veuillez ne pas créer de problème public sur github.
Si vous emballez ou distribuez s2n-tls, ou utilisez s2n-tls dans le cadre d'un grand service multi-utilisateurs, vous pourriez être éligible à une notification préalable des futures versions de s2n-tls. Veuillez contacter [email protected].
Si vous souhaitez contribuer à s2n-tls, veuillez consulter notre guide de développement.
Consultez notre liste de liaisons de langage pour connaître les liaisons de langage pour s2n-tls dont nous avons connaissance.