TLS com rustls
Termine e origine TLS em Rust com rustls - TLS puro em Rust usando backends de criptografia aws-lc-rs ou ring.
Receita
Cartão de referência rápida - pronto para copiar e colar.
[dependencies]
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] }
rustls = "0.23"
tokio-rustls = "0.26"let client = reqwest::Client::builder()
.use_rustls_tls()
.build()?;Quando usar isso: Clientes e servidores HTTPS sem dependência de OpenSSL - comum em microsserviços Rust e binários estáticos.
Exemplo de Trabalho
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
use std::sync::Arc;
fn load_certs(pem: &str) -> Vec<CertificateDer<'static>> {
rustls_pemfile::certs(&mut pem.as_bytes())
.map(|r| r.unwrap())
.collect()
}
fn load_key(pem: &str) -> PrivateKeyDer<'static> {
rustls_pemfile::private_key(&mut pem.as_bytes())
.next()
.unwrap()
.unwrap()
}
fn rustls_server_config(cert_pem: &str, key_pem: &str) -> Arc<rustls::ServerConfig> {
let certs = load_certs(cert_pem);
let key = load_key(key_pem);
let config = rustls::ServerConfig::builder()
.with_no_client_auth()
.with_single_cert(certs, key)
.unwrap();
Arc::new(config)
}O que isso demonstra:
- Carregamento de PEM com
rustls-pemfile. ServerConfig::builder()com cadeia de certificados e chave privada.- Configuração
Arccompartilhada entre conexões. - Nenhuma dependência do sistema OpenSSL.
Mergulho Profundo
Como Funciona
- rustls implementa TLS 1.2/1.3 sem OpenSSL.
- reqwest/axum/hyper integram via conectores rustls.
- Raízes WebPKI via crates
webpki-rootsou verificador de plataforma.
Padrões de Implantação
| Padrão | Onde o TLS é executado |
|---|---|
| Terminação de Borda | Balanceador de carga (comum) |
| Sidecar | Malha Envoy/mTLS |
| Em processo | rustls em Axum (menos comum) |
Notas de Rust
// Cliente mTLS confia em CA personalizada
let mut roots = rustls::RootCertStore::empty();
roots.add(ca_cert).unwrap();
let config = rustls::ClientConfig::builder()
.with_root_certificates(roots)
.with_client_auth_cert(client_certs, client_key)?;Armadilhas
- Expiração de certificado - Sem renovação automática no aplicativo. Correção: cert-manager, Let's Encrypt ou certificados gerenciados pelo balanceador de carga.
- Verificação desativada -
danger_accept_invalid_certsem produção. Correção: Armazenamento de raiz adequado e verificação de nome de host. - Incompatibilidade de versão TLS - Clientes antigos precisam do TLS 1.2 habilitado. Correção: Configure a política do rustls para a versão mínima.
- SAN incorreto - Certificado não possui o nome DNS do serviço. Correção: Inclua todos os nomes DNS internos no CSR.
- Chave no repositório - Chave privada comprometida no git. Correção: Montagem do gerenciador de segredos em tempo de execução.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| OpenSSL (native-tls) | Ferramentas legadas de CA corporativa | O objetivo é evitar a dependência de OpenSSL |
| Terminação Externa | Ingress do Kubernetes | Criptografia de ponta a ponta necessária dentro da VPC |
mesalink | Camada de compatibilidade OpenSSL | Rustls novo |
FAQs
TLS padrão do reqwest?
Habilite o recurso rustls-tls explicitamente em Cargo.toml.
Axum HTTPS?
Frequentemente TLS na entrada; axum-server ou hyper rustls para HTTPS direto.
Rotacionar certificados?
Recarregar a configuração em SIGHUP ou reiniciar pods com novo volume de segredo.
Proxy corporativo?
CA raiz personalizada adicionada ao RootCertStore.
ALPN?
HTTP/2 negociado via ALPN na configuração do rustls para gRPC.
FIPS?
Módulo FIPS do aws-lc-rs onde a conformidade exige.
Depurar handshake?
RUSTLS_LOG=debug - nunca em produção com segredos.
Desenvolvimento autoassinado?
mkcert local ou raiz personalizada apenas para desenvolvimento - nunca envie para produção.
Desempenho?
rustls competitivo com OpenSSL; a retomada de sessão ajuda na latência.
Tonic TLS?
Server::builder().tls_config(...)? com identidade do rustls.
Relacionado
- Clientes HTTP (reqwest) - Cliente HTTPS
- gRPC com tonic - Serviços mTLS
- Gerenciamento de Segredos - Armazenamento de chaves
- Melhores Práticas de Rede - Regras TLS
- Criptografia (ring / RustCrypto) - Primitivas criptográficas
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.