Message d’erreur
Peer certificate subjectAltName did not match expected name `api.example.com'
Également affiché sous la forme
- Warning: file_get_contents(): Peer certificate subjectAltName did not match expected name `api.example.com'
PHP encadre le nom attendu par un accent grave avant et une apostrophe après. Un certificat sans extension SAN produit à la place « Peer certificate CN=`…' did not match expected CN=`…' ». Les clients fondés sur ext-curl (Guzzle) signalent la même situation par l’erreur cURL 60, avec « no alternative certificate subject name matches target hostname ».
PHP streams (openssl stream wrapper) — verify_peer_name check
Ce que cela signifie
La vérification de la chaîne de certificats a réussi, mais aucun des noms alternatifs du sujet (SAN) du certificat ne correspond au nom attendu par PHP (l’hôte de l’URL, ou l’option de contexte peer_name). Le wrapper de flux de PHP effectue lui-même ce contrôle après le handshake et refuse la connexion, puis signale « Failed to enable crypto ».
Pourquoi cela se produit
Le certificat ne mentionne pas le nom d’hôte
fréquenteL’URL utilise un nom pour lequel le certificat n’a pas été émis.
Connexion par adresse IP ou par un alias interne
fréquenteFréquent avec les connexions de base de données, LDAP et SMTP configurées avec des adresses IP.
Relais SMTP joints sous un autre nom
occasionnelleDes bibliothèques d’envoi d’e-mails configurées avec « localhost » ou un alias du fournisseur, alors que le serveur présente un certificat établi pour son nom public.
Comment corriger l’erreur
- 1.
Comparer la liste des SAN avec l’hôte
Le message indique l’hôte attendu ; les SAN du certificat montrent ce qui est couvert.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Définir peer_name lors d’une connexion par adresse
L’option de contexte ssl peer_name indique à PHP quel nom vérifier, tandis que le socket se connecte à une adresse 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.
Utiliser le nom d’hôte du certificat dans les DSN
Configurez les bibliothèques d’envoi d’e-mails et les clients avec le nom que porte le certificat du serveur.
text # Mail libraries (PHPMailer, Symfony Mailer): use the SMTP host name from the certificate MAILER_DSN=smtp://user:pass@mail.example.com:587
Erreurs associées
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