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
Das Zertifikat führt den Hostnamen nicht auf
häufigDie URL verwendet einen Namen, für den das Zertifikat nicht ausgestellt wurde.
Verbindung über eine IP-Adresse oder einen internen Alias
häufigHäufig bei Datenbank-, LDAP- und SMTP-Verbindungen, die mit IP-Adressen konfiguriert sind.
SMTP-Relays, die unter einem anderen Namen angesprochen werden
gelegentlichMailer, die mit „localhost“ oder einem Alias des Providers konfiguriert sind, während der Server ein Zertifikat für seinen öffentlichen Namen präsentiert.
So behebst du den Fehler
- 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.
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.
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
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