Перейти к содержимому
ecdsa.com
PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries)PHP

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

SSL operation failed with code 1. OpenSSL Error messages:

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

  • Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:

PHP выводит предупреждение в двух строках: «SSL operation failed with code 1. OpenSSL Error messages:», а затем одну или несколько ошибок OpenSSL. Сборки с OpenSSL 1.1.1 вместо этого показывают «error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed».

PHP streams (file_get_contents, fopen, stream_socket_client, SoapClient, mail libraries) — openssl stream wrapper

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

Поток PHP (file_get_contents, fopen, SoapClient, stream_socket_client и построенные на них почтовые и FTP-библиотеки) не смог выполнить TLS-рукопожатие. Код 1 — это ошибка SSL_ERROR_SSL из OpenSSL; настоящая причина указана на следующей строке, чаще всего это «error:0A000086:SSL routines::certificate verify failed». Затем PHP добавляет «Failed to enable crypto» и «Failed to open stream: operation failed» — это следствия, а не причины.

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

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

  1. 1.

    Прочитайте следующую строку от OpenSSL

    «certificate verify failed» указывает на проблему с доверием или датами; ошибки протокола указывают на конфигурацию TLS на сервере.

    text
    Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
    error:0A000086:SSL routines::certificate verify failed      <- trust/chain/date problem
    Warning: file_get_contents(): Failed to enable crypto       <- consequence, not the cause
  2. 2.

    Задайте openssl.cafile

    Потоки PHP используют openssl.cafile (или openssl.capath), а ext-curl — curl.cainfo, поэтому задайте оба параметра.

    ini
    ; php.ini — CA bundle for PHP streams (file_get_contents, SoapClient, stream_socket_client)
    openssl.cafile = "/etc/ssl/certs/ca-certificates.crt"
  3. 3.

    Передайте CA для одного запроса

    Контекст потока с ssl.cafile доверяет частному CA, не ослабляя проверку для всего остального.

    php
    // One request with a private CA; verification stays on
    $context = stream_context_create(['ssl' => [
        'cafile' => '/etc/ssl/private-ca/corp-root-ca.pem',
        'verify_peer' => true,
        'verify_peer_name' => true,
    ]]);
    $body = file_get_contents('https://api.example.com/', false, $context);

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

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