Aller au contenu
ecdsa.com
PHP streams (openssl stream wrapper)PHP

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

Comment corriger l’erreur

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

Parcourir toute la base de données des erreurs de signature