s2n-tls ist eine C99-Implementierung der TLS/SSL-Protokolle, die einfach, klein, schnell und mit Priorität auf Sicherheit konzipiert ist. Es wird unter der Apache-Lizenz 2.0 veröffentlicht und lizenziert.
s2n-tls ist die Abkürzung für „Signal to Noise“ und ist eine Anspielung auf den fast magischen Akt der Verschlüsselung – die Tarnung bedeutungsvoller Signale, wie z. B. Ihrer kritischen Daten, als scheinbar zufälliges Rauschen.
-- s2n-tls-Ankündigung
# 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
Weitere Anleitungen zum Erstellen von s2n-tls für Ihre Plattform finden Sie in der Build-Dokumentation zu s2n-tls.
Wenn Sie glauben, ein sicherheitsrelevantes Problem gefunden zu haben, folgen Sie bitte unserem Sicherheitsbenachrichtigungsprozess.
Wenn Sie Fragen zum Einreichen von PRs, zur Verwendung der s2n-tls-API oder Ähnlichem haben, öffnen Sie bitte ein Problem.
s2n-tls verwendet Doxygen, um seine öffentliche API zu dokumentieren. Die neueste s2n-tls-Dokumentation finden Sie auf den GitHub-Seiten. Der Nutzungsleitfaden erklärt, wie verschiedene TLS-Funktionen konfiguriert und verwendet werden können.
Dokumentation für ältere Versionen oder Zweige von s2n-tls kann lokal generiert werden. Um die Dokumentation zu generieren, installieren Sie doxygen und führen Sie doxygen docs/doxygen/Doxyfile
aus. Die Doxygen-Dokumentation finden Sie jetzt unter docs/doxygen/output/html/index.html
.
Anweisungen zur Installation von Doxygen finden Sie auf der Doxygen-Webseite.
Wir haben die Distributionen und Plattformen in zwei Stufen aufgelistet: Bei Plattformen der Stufe 1 wird garantiert, dass sie CI erstellen, ausführen und Tests bestehen. Plattformen der Stufe 2 werden garantiert erstellt und wir werden uns mit ihnen befassen, aber sie werden derzeit nicht in unserem CI ausgeführt und werden nicht bei jedem Commit aktiv überprüft. Wenn Sie eine Plattform nutzen, die unten nicht aufgeführt ist, und diese zu unserem CI hinzufügen möchten (oder helfen möchten!), eröffnen Sie bitte ein Problem zur Diskussion.
Verteilung in CI | Plattformen |
---|---|
Ubuntu18, Ubuntu24** | x86_64 |
Ubuntu22 | x86_64, i686 |
AL2, AL2023** | x86_64, aarch64 |
NixOS | x86_64, aarch64 |
OpenBSD 7.4 | x86_64 |
FreeBSD aktuell | x86_64 |
OSX aktuell | aarch64 |
**In Arbeit
Verteilung nicht in CI | Plattformen |
---|---|
Fedora Core 34-36 | x86_64, aarch64 |
Ubuntu14/16/20 | x86_64, aarch64 |
Ubuntu18/22/24 | aarch64 |
OSX 12-14 | x86_64 |
Diese Verteilerlisten erheben keinen Anspruch auf Vollständigkeit und fehlende Tools oder eine fehlende unterstützte libcrypto-Bibliothek könnten einen erfolgreichen Build verhindern.
Die s2n-tls-I/O-APIs sind so konzipiert, dass sie für Entwickler, die mit den weit verbreiteten POSIX-I/O-APIs vertraut sind, intuitiv sind, und s2n-tls unterstützt blockierende, nicht blockierende und Vollduplex-I/O. Darüber hinaus gibt es in s2n-tls keine Sperren oder Mutexe.
/* 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 );
Einzelheiten zum Erstellen der s2n-tls-Bibliothek und zur Verwendung von s2n-tls in einer von Ihnen entwickelten Anwendung finden Sie im Nutzungshandbuch.
s2n-tls implementiert SSLv3, TLS1.0, TLS1.1, TLS1.2 und TLS1.3. Zur Verschlüsselung unterstützt s2n-tls 128-Bit- und 256-Bit-AES in den CBC- und GCM-Modi, ChaCha20, 3DES und RC4. Für die Vorwärtsgeheimnis unterstützt s2n-tls sowohl DHE als auch ECDHE. s2n-tls unterstützt außerdem die TLS-Erweiterungen Server Name Indicator (SNI), Application-Layer Protocol Negotiation (ALPN) und Online Certificate Status Protocol (OCSP). SSLv3, RC4, 3DES und DHE sind aus Sicherheitsgründen jeweils standardmäßig deaktiviert.
Da es schwierig sein kann, den Überblick darüber zu behalten, welche Verschlüsselungsalgorithmen und -protokolle am besten zu verwenden sind, verfügt s2n-tls über eine einfache API, um die neuesten „Standard“-Einstellungen zu verwenden. Wenn Sie aus Gründen der Abwärtskompatibilität lieber auf einer bestimmten Version bleiben möchten, wird diese ebenfalls unterstützt.
/* 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" )
Intern verfolgt s2n-tls einen systematischen Ansatz zum Datenschutz und umfasst mehrere Mechanismen zur Verbesserung der Sicherheit.
Der Code von s2n-tls ist strukturiert und geschrieben, wobei der Schwerpunkt auf der Überprüfbarkeit liegt. Der gesamte s2n-tls-Code unterliegt einer Codeüberprüfung und wir planen, jährlich Sicherheitsbewertungen von s2n-tls durchzuführen.
Bisher gab es zwei externe Überprüfungen von s2n-tls auf Codeebene, darunter eine durch einen kommerziellen Sicherheitsanbieter. s2n-tls wurde auch mit einigen vertrauenswürdigen Mitgliedern der breiteren Kryptographie-, Sicherheits- und Open-Source-Community geteilt. Alle entdeckten Probleme werden immer im s2n-tls Issue Tracker aufgezeichnet.
Neben Codeüberprüfungen wird s2n-tls regelmäßig statischen Analysen, Fuzz-Tests und Penetrationstests unterzogen. Es wurden mehrere Penetrationstests durchgeführt, darunter zwei von kommerziellen Anbietern.
s2n-tls umfasst positive und negative Unit-Tests und End-to-End-Testfälle.
Die Unit-Test-Abdeckung kann hier eingesehen werden. Beachten Sie, dass dies die Einheitenabdeckung für einen bestimmten Build darstellt. Da dieser Build nicht unbedingt alle s2n-tls-Funktionen unterstützt, kann die Testabdeckung künstlich verringert werden.
s2n-tls verschlüsselt oder löscht Klartextdaten so schnell wie möglich. Beispielsweise werden entschlüsselte Datenpuffer gelöscht, wenn sie von der Anwendung gelesen werden.
s2n-tls nutzt Betriebssystemfunktionen, um zu verhindern, dass Daten auf die Festplatte ausgelagert werden oder in Core-Dumps erscheinen.
s2n-tls vermeidet die Implementierung selten verwendeter Optionen und Erweiterungen sowie von Funktionen, die in der Vergangenheit Sicherheitslücken auf Protokollebene ausgelöst haben. Beispielsweise gibt es keine Unterstützung für DTLS.
Die Sicherheit von TLS und den zugehörigen Verschlüsselungsalgorithmen hängt von der sicheren Generierung von Zufallszahlen ab. s2n-tls stellt jedem Thread zwei separate Zufallszahlengeneratoren zur Verfügung. Eine für „öffentliche“, zufällig generierte Daten, die im Klartext erscheinen können, und eine für „private“ Daten, die geheim bleiben sollten. Dieser Ansatz verringert das Risiko potenzieller Vorhersagbarkeitsschwächen in Algorithmen zur Zufallszahlengenerierung, die durch kontextübergreifende Informationslecks entstehen.
s2n-tls wurde so strukturiert, dass verschiedene Verschlüsselungsbibliotheken verwendet werden können. Heute unterstützt s2n-tls AWS-LC, OpenSSL (Versionen 1.0.2, 1.1.1 und 3.0.x), LibreSSL und BoringSSL, um die zugrunde liegenden kryptografischen Operationen auszuführen. Eine Liste der libcrypto-spezifischen Funktionen finden Sie in der libcrypto-Build-Dokumentation.
s2n-tls bietet strukturierte Unterstützung für die Blendung zeitbasierter Seitenkanäle, die möglicherweise vertrauliche Daten preisgeben. Wenn s2n-tls beispielsweise einen TLS-Datensatz oder eine Handshake-Nachricht nicht analysieren kann, fügt s2n-tls eine zufällige Verzögerung zwischen 10 und 30 Sekunden hinzu, granular auf Nanosekunden, bevor es antwortet. Dies erhöht die Komplexität realer Timing-Seitenkanalangriffe um mindestens den Faktor zweistellige Billionen.
s2n-tls verwendet einfache Tabellen zur Steuerung der TLS/SSL-Zustandsmaschinen, wodurch es schwierig wird, ungültige Out-of-Order-Zustände zu erzeugen.
s2n-tls ist in C geschrieben, nutzt jedoch nur geringfügig die Funktionen der Standard-C-Bibliothek und umschließt die gesamte Speicherverwaltung, Zeichenfolgenverarbeitung und Serialisierung in systematischen, grenzenerzwingenden Prüfungen.
Wenn Sie ein potenzielles Sicherheitsproblem in s2n-tls entdecken, bitten wir Sie, AWS Security über unsere Schwachstellen-Meldeseite zu benachrichtigen. Bitte erstellen Sie kein öffentliches Github-Problem.
Wenn Sie s2n-tls verpacken oder vertreiben oder s2n-tls als Teil eines großen Mehrbenutzerdienstes verwenden, haben Sie möglicherweise Anspruch auf eine Vorabbenachrichtigung über zukünftige s2n-tls-Releases. Bitte kontaktieren Sie [email protected].
Wenn Sie daran interessiert sind, zu s2n-tls beizutragen, lesen Sie bitte unseren Entwicklungsleitfaden.
In unserer Liste der Sprachbindungen finden Sie die uns bekannten Sprachbindungen für s2n-tls.