Mensagem de erro
invalid peer certificate: certificate not valid for name "api.example.com"; certificate is only valid for DnsName("www.example.com")
O nome esperado e a lista apresentada são preenchidos a cada falha; endereços IP aparecem como IpAddress(…). Versões anteriores do rustls imprimiam só o nome da variante (“invalid peer certificate: NotValidForName”).
rustls 0.23 (via reqwest, ureq, hyper-rustls) — CertificateError::NotValidForNameContext
O que significa
A cadeia é confiável, mas o nome ao qual o cliente se conectou não está entre os Subject Alternative Names do certificado. O rustls 0.23 lista os dois lados: o nome esperado e todos os nomes que o certificado apresenta (entradas DnsName e IpAddress), o que deixa a divergência evidente.
Por que acontece
O certificado não cobre este nome
comumOutro subdomínio, o domínio apex ou um serviço renomeado não está na lista de SANs; curingas cobrem um único rótulo.
Conexão por IP ou por um alias interno
comumNomes de serviço (Kubernetes, docker-compose) ou endereços IP diretos para os quais o certificado nunca foi emitido.
O servidor enviou o certificado padrão
ocasionalUm proxy sem configuração para o nome solicitado apresenta o certificado de outro site.
Como corrigir
- 1.
Comparar os nomes apresentados com a URL
A mensagem já os lista; o openssl confirma o que o servidor envia.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Substituir o endereço, não o nome
O ClientBuilder::resolve do reqwest fixa um nome de host em um endereço de socket, de modo que a verificação continua usando o nome do certificado.
rust // Keep the certificate's name in the URL and send the connection to a specific address let addr: std::net::SocketAddr = "10.0.0.5:443".parse()?; let client = reqwest::Client::builder().resolve("www.example.com", addr).build()?; let resp = client.get("https://www.example.com/health").send().await?; - 3.
Reemitir o certificado com todos os nomes em uso
Adicione ao certificado os nomes DNS que faltam (ou as entradas de IP).
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com"