Pular para o conteúdo
ecdsa.com
PHP streams (openssl stream wrapper)PHP

Mensagem de erro

Peer certificate subjectAltName did not match expected name `api.example.com'

Também aparece como

  • Warning: file_get_contents(): Peer certificate subjectAltName did not match expected name `api.example.com'

O PHP escreve uma crase antes do nome esperado e um apóstrofo depois dele. Certificados sem a extensão SAN produzem, em vez disso, “Peer certificate CN=`…' did not match expected CN=`…'”. Clientes baseados no ext-curl (Guzzle) relatam a mesma situação como cURL error 60, com “no alternative certificate subject name matches target hostname”.

PHP streams (openssl stream wrapper) — verify_peer_name check

O que significa

A cadeia de certificados foi verificada, mas nenhum dos Subject Alternative Names do certificado corresponde ao nome que o PHP esperava (o host da URL ou a opção de contexto peer_name). O stream wrapper do PHP faz essa verificação por conta própria depois do handshake e recusa a conexão; em seguida vem “Failed to enable crypto”.

Por que acontece

Como corrigir

  1. 1.

    Comparar a lista de SANs com o host

    A mensagem indica o host esperado; os SANs do certificado mostram o que está coberto.

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -ext subjectAltName
  2. 2.

    Definir peer_name ao conectar por endereço

    A opção de contexto ssl peer_name diz ao PHP qual nome verificar enquanto o socket se conecta a um endereço IP.

    php
    // Connect to an address but verify the certificate's real name
    $context = stream_context_create(['ssl' => ['peer_name' => 'mail.example.com']]);
    $socket = stream_socket_client('tls://10.0.0.25:465', $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
  3. 3.

    Usar nos DSNs o nome de host do certificado

    Configure mailers e clientes com o nome que consta no certificado do servidor.

    text
    # Mail libraries (PHPMailer, Symfony Mailer): use the SMTP host name from the certificate
    MAILER_DSN=smtp://user:pass@mail.example.com:587

Erros relacionados

Ver toda a base de erros de assinatura