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
実行します。 doxygen のドキュメントはdocs/doxygen/output/html/index.html
にあります。
Doxygen のインストール手順は、Doxygen の Web ページで入手できます。
ディストリビューションとプラットフォームを 2 つの階層に分けてリストしました。階層 1 のプラットフォームは、CI でビルド、実行、テストに合格することが保証されています。 Tier 2 プラットフォームはビルドが保証されており、それらに対して未解決の問題に対処しますが、現在 CI で実行されておらず、コミットごとに積極的にレビューされていません。以下にリストされていないプラットフォームを使用していて、それを CI に追加することをリクエスト (または支援) したい場合は、ディスカッションのために問題を開いてください。
CIでの配布 | プラットフォーム |
---|---|
Ubuntu18、Ubuntu24** | x86_64 |
Ubuntu22 | x86_64、i686 |
AL2、AL2023** | x86_64、aarch64 |
NixOS | x86_64、aarch64 |
OpenBSD 7.4 | x86_64 |
最新のFreeBSD | x86_64 |
OSX最新 | aarch64 |
**進行中の作業
CI にないディストリビューション | プラットフォーム |
---|---|
フェドラコア 34-36 | x86_64、aarch64 |
Ubuntu14/16/20 | x86_64、aarch64 |
Ubuntu18/22/24 | aarch64 |
OSX12-14 | x86_64 |
これらの配布リストは網羅的なものではなく、ツールが不足していたり、サポートされている libcrypto ライブラリが不足していると、ビルドが成功しない可能性があります。
s2n-tls I/O API は、広く使用されている POSIX I/O API に精通した開発者にとって直感的に操作できるように設計されており、ブロッキング、ノンブロッキング、および全二重 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 は、Server Name Indicator (SNI)、Application-Layer Protocol Negotiation (ALPN)、および Online Certificate Status Protocol (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 の外部コードレベルのレビューが 2 件あり、そのうち 1 件は商用セキュリティ ベンダーによるものです。 s2n-tls は、より広範な暗号化、セキュリティ、およびオープンソース コミュニティの信頼できるメンバーとも共有されています。発見された問題は常に s2n-tls 問題トラッカーに記録されます。
コードレビューに加えて、s2n-tls は定期的な静的分析、ファズテスト、侵入テストの対象となります。商用ベンダーによる 2 件を含む、いくつかの侵入テストが実施されました。
s2n-tls には、ポジティブ単体テストとネガティブ単体テスト、およびエンドツーエンドのテスト ケースが含まれています。
単体テストのカバレッジはここで確認できます。これは特定のビルドのユニット カバレッジを表すことに注意してください。そのビルドは必ずしもすべての s2n-tls 機能をサポートするとは限らないため、テスト カバレッジが人為的に低下する可能性があります。
s2n-tls は、平文データをできるだけ早く暗号化または消去します。たとえば、復号化されたデータ バッファは、アプリケーションによって読み取られるときに消去されます。
s2n-tls は、オペレーティング システムの機能を使用して、データがディスクにスワップされたり、コア ダンプに表示されたりしないように保護します。
s2n-tls は、めったに使用されないオプションや拡張機能、さらにはプロトコル レベルの脆弱性を引き起こしてきた機能の実装を回避します。たとえば、DTLS はサポートされていません。
TLS とそれに関連する暗号化アルゴリズムのセキュリティは、安全な乱数の生成に依存します。 s2n-tls は、すべてのスレッドに 2 つの個別の乱数ジェネレーターを提供します。 1 つは平文で表示される可能性があるランダムに生成された「パブリック」データ用で、もう 1 つは秘密にしておく必要がある「プライベート」データ用です。このアプローチにより、コンテキスト間での情報漏洩による乱数生成アルゴリズムの潜在的な予測可能性の弱点のリスクが軽減されます。
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 の言語バインディングについては、言語バインディング リストを参照してください。