Сообщение об ошибке
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» — это следствия, а не причины.
Почему это происходит
CA сервера не считается доверенным
частоЧастный CA или CA прокси либо сервер, который не отправляет свой промежуточный сертификат.
У потоков PHP нет пригодного пакета сертификатов CA
частоopenssl.cafile не задан в системах, где по пути OpenSSL по умолчанию нет пакета сертификатов (Windows, минимальные образы).
Сбой протокола или шифра
иногдаЕсли на второй строке указана другая причина («unsupported protocol», «alert handshake failure»), у сервера и PHP нет общей версии TLS или общего шифра.
Как исправить
- 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.
Задайте 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.
Передайте 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);