Перейти к содержимому
ecdsa.com
PHP streams (openssl stream wrapper)PHP

Сообщение об ошибке

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

Также выводится как

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

PHP обрамляет ожидаемое имя обратным апострофом перед ним и обычным апострофом после него. Для сертификатов без расширения SAN вместо этого выводится «Peer certificate CN=`…' did not match expected CN=`…'». Клиенты на основе ext-curl (Guzzle) выдают в той же ситуации ошибку cURL 60 с текстом «no alternative certificate subject name matches target hostname».

PHP streams (openssl stream wrapper) — verify_peer_name check

Что это означает

Цепочка сертификатов прошла проверку, но ни одно из альтернативных имён субъекта (SAN) сертификата не совпадает с именем, которое ожидал PHP (хостом из URL или параметром контекста peer_name). Обёртка потоков PHP сама выполняет эту проверку после рукопожатия и отклоняет соединение, после чего выводит «Failed to enable crypto».

Почему это происходит

Как исправить

  1. 1.

    Сравните список SAN с хостом

    В сообщении указан ожидаемый хост, а записи SAN сертификата показывают, какие имена он покрывает.

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

    Задайте peer_name при подключении по адресу

    Параметр peer_name контекста ssl указывает PHP, какое имя проверять, когда сокет подключается по 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.

    Указывайте в DSN имя хоста из сертификата

    Указывайте в настройках библиотек отправки почты и клиентов то имя, которое содержит сертификат сервера.

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

Связанные ошибки

Открыть всю базу ошибок подписей