Zum Inhalt springen
ecdsa.com
PHP streams (openssl stream wrapper)PHP

Fehlermeldung

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

Auch ausgegeben als

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

PHP zitiert den erwarteten Namen mit einem Backtick davor und einem Apostroph dahinter. Zertifikate ohne SAN-Erweiterung erzeugen stattdessen „Peer certificate CN=`…' did not match expected CN=`…'“. Clients auf Basis von ext-curl (Guzzle) melden dieselbe Situation als cURL-Fehler 60 mit „no alternative certificate subject name matches target hostname“.

PHP streams (openssl stream wrapper) — verify_peer_name check

Was der Fehler bedeutet

Die Prüfung der Zertifikatskette war erfolgreich, aber keiner der Subject Alternative Names des Zertifikats passt zu dem Namen, den PHP erwartet hat (dem Host aus der URL oder der Kontextoption peer_name). Der Stream-Wrapper von PHP führt diese Prüfung nach dem Handshake selbst durch und verweigert die Verbindung; danach folgt „Failed to enable crypto“.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    SAN-Liste mit dem Host vergleichen

    Die Meldung nennt den erwarteten Host; die SANs des Zertifikats zeigen, was abgedeckt ist.

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

    Bei Verbindungen über eine Adresse peer_name setzen

    Die Option peer_name im ssl-Kontext teilt PHP mit, welchen Namen es prüfen soll, während sich der Socket mit einer IP-Adresse verbindet.

    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.

    Hostnamen des Zertifikats in DSNs verwenden

    Konfiguriere Mailer und Clients mit dem Namen, den das Zertifikat des Servers enthält.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen