Pular para o conteúdo
ecdsa.com
rustls 0.23 (via reqwest, ureq, hyper-rustls)Rust

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

Como corrigir

  1. 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. 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. 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"

Erros relacionados

Ver toda a base de erros de assinatura