s2n-tls é uma implementação C99 dos protocolos TLS/SSL projetada para ser simples, pequena, rápida e com segurança como prioridade. É lançado e licenciado sob a Licença Apache 2.0.
s2n-tls é a abreviação de “sinal para ruído” e é uma referência ao ato quase mágico de criptografia – disfarçar sinais significativos, como seus dados críticos, como ruído aparentemente aleatório.
- anúncio 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 a documentação de construção do s2n-tls para obter mais orientações sobre a construção do s2n-tls para sua plataforma.
Se você acha que encontrou um problema com impacto na segurança, siga nosso Processo de Notificação de Segurança.
Se você tiver alguma dúvida sobre o envio de PRs, uso da API s2n-tls ou algo semelhante, abra um problema.
s2n-tls usa Doxygen para documentar sua API pública. A documentação mais recente do s2n-tls pode ser encontrada nas páginas do GitHub. O Guia de uso explica como diferentes recursos TLS podem ser configurados e usados.
A documentação para versões mais antigas ou ramificações do s2n-tls pode ser gerada localmente. Para gerar a documentação, instale o doxygen e execute doxygen docs/doxygen/Doxyfile
. A documentação do doxygen agora pode ser encontrada em docs/doxygen/output/html/index.html
.
As instruções de instalação do Doxygen estão disponíveis na página do Doxygen.
Listamos as distribuições e plataformas em dois níveis: As plataformas de nível 1 têm garantia de construção, execução e aprovação em testes de CI. As plataformas de nível 2 têm garantia de construção e abordaremos os problemas abertos contra elas, mas elas não estão atualmente em execução em nosso CI e não são revisadas ativamente a cada commit. Se você usa uma plataforma não listada abaixo e gostaria de solicitar (ou ajudar!) adicioná-la ao nosso CI, abra um problema para discussão.
Distribuição em 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 mais recente | x86_64 |
OSX mais recente | aarch64 |
**Trabalho em andamento
Distribuição não em 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 |
Essas listas de distribuição não são exaustivas e a falta de ferramentas ou a falta de uma biblioteca libcrypto suportada podem impedir uma compilação bem-sucedida.
As APIs de E/S s2n-tls são projetadas para serem intuitivas para desenvolvedores familiarizados com as APIs de E/S POSIX amplamente utilizadas, e s2n-tls oferece suporte a E/S com bloqueio, sem bloqueio e full-duplex. Além disso, não há bloqueios ou mutexes no 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 obter detalhes sobre como construir a biblioteca s2n-tls e como usar s2n-tls em um aplicativo que você está desenvolvendo, consulte o Guia de Uso.
s2n-tls implementa SSLv3, TLS1.0, TLS1.1, TLS1.2 e TLS1.3. Para criptografia, s2n-tls suporta AES de 128 e 256 bits nos modos CBC e GCM, ChaCha20, 3DES e RC4. Para sigilo de encaminhamento, s2n-tls oferece suporte a DHE e ECDHE. s2n-tls também oferece suporte às extensões TLS Server Name Indicator (SNI), Application-Layer Protocol Negotiation (ALPN) e Online Certificate Status Protocol (OCSP). SSLv3, RC4, 3DES e DHE estão desabilitados por padrão por motivos de segurança.
Como pode ser difícil controlar quais algoritmos e protocolos de criptografia são melhores para usar, o s2n-tls apresenta uma API simples para usar o conjunto de preferências "padrão" mais recente. Se você preferir permanecer em uma versão específica para compatibilidade com versões anteriores, isso também será suportado.
/* 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, o s2n-tls adota uma abordagem sistemática à proteção de dados e inclui vários mecanismos projetados para melhorar a segurança.
O código do s2n-tls é estruturado e escrito com foco na capacidade de revisão. Todo o código s2n-tls está sujeito a revisão de código e planejamos concluir avaliações de segurança do s2n-tls anualmente.
Até o momento, houve duas revisões externas em nível de código do s2n-tls, incluindo uma feita por um fornecedor de segurança comercial. O s2n-tls também foi compartilhado com alguns membros confiáveis das comunidades mais amplas de criptografia, segurança e código aberto. Quaisquer problemas descobertos são sempre registrados no rastreador de problemas s2n-tls.
Além das revisões de código, o s2n-tls está sujeito a análises estáticas regulares, testes fuzz e testes de penetração. Vários testes de penetração ocorreram, incluindo dois realizados por fornecedores comerciais.
s2n-tls inclui testes de unidade positivos e negativos e casos de teste ponta a ponta.
A cobertura do teste unitário pode ser visualizada aqui. Observe que isso representa a cobertura da unidade para uma construção específica. Como essa compilação não suporta necessariamente todos os recursos do s2n-tls, a cobertura do teste pode ser reduzida artificialmente.
s2n-tls criptografa ou apaga dados de texto simples o mais rápido possível. Por exemplo, os buffers de dados descriptografados são apagados à medida que são lidos pelo aplicativo.
s2n-tls usa recursos do sistema operacional para proteger os dados de serem trocados para o disco ou aparecerem em core dumps.
s2n-tls evita a implementação de opções e extensões raramente usadas, bem como recursos com histórico de acionamento de vulnerabilidades em nível de protocolo. Por exemplo, não há suporte para DTLS.
A segurança do TLS e de seus algoritmos de criptografia associados depende da geração segura de números aleatórios. s2n-tls fornece a cada thread dois geradores de números aleatórios separados. Um para dados “públicos” gerados aleatoriamente que podem aparecer de forma clara e outro para dados “privados” que devem permanecer secretos. Essa abordagem diminui o risco de potenciais fraquezas de previsibilidade em algoritmos de geração de números aleatórios devido ao vazamento de informações entre contextos.
O s2n-tls foi estruturado para que diferentes bibliotecas de criptografia possam ser utilizadas. Hoje, o s2n-tls oferece suporte a AWS-LC, OpenSSL (versões 1.0.2, 1.1.1 e 3.0.x), LibreSSL e BoringSSL para executar as operações criptográficas subjacentes. Verifique a documentação de construção do libcrypto para obter uma lista de recursos específicos do libcrypto.
s2n-tls inclui suporte estruturado para cegar canais laterais baseados em tempo que podem vazar dados confidenciais. Por exemplo, se o s2n-tls falhar ao analisar um registro TLS ou uma mensagem de handshake, o s2n-tls adicionará um atraso aleatório entre 10 e 30 segundos, granular em nanossegundos, antes de responder. Isto aumenta a complexidade dos ataques de canal lateral de temporização no mundo real por um fator de pelo menos dezenas de trilhões.
s2n-tls usa tabelas simples para controlar as máquinas de estado TLS/SSL, dificultando o surgimento de estados fora de ordem inválidos.
s2n-tls é escrito em C, mas faz uso leve das funções padrão da biblioteca C e envolve todo o manuseio de memória, manipulação de strings e serialização em verificações sistemáticas de aplicação de limites.
Se você descobrir um possível problema de segurança no s2n-tls, pedimos que você notifique a AWS Security por meio de nossa página de relatórios de vulnerabilidades. Por favor, não crie um problema público no GitHub.
Se você empacotar ou distribuir o s2n-tls, ou usar o s2n-tls como parte de um grande serviço multiusuário, poderá ser elegível para pré-notificação de lançamentos futuros do s2n-tls. Entre em contato com [email protected].
Se você estiver interessado em contribuir com o s2n-tls, consulte nosso guia de desenvolvimento.
Consulte nossa lista de ligações de idiomas para ligações de idiomas para s2n-tls que conhecemos.