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
O certificado não lista o nome do host
comumA URL usa um nome para o qual o certificado não foi emitido.
Conexão por IP ou por um alias interno
comumComum em conexões com banco de dados, LDAP e SMTP configuradas com endereços IP.
Relays SMTP acessados por outro nome
ocasionalMailers configurados com “localhost” ou com um alias do provedor, enquanto o servidor apresenta um certificado para o nome público dele.
Como corrigir
- 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.
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.
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
SSL operation failed with code 1. OpenSSL Error messages:PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries)curl: (60) SSL: no alternative certificate subject name matches target hostname…curl (OpenSSL backend)x509: certificate is valid for example.com, not api.example.comGo crypto/x509