Я пытаюсь получить PHP, принимающий сертификат, который принимает Chrome.
Я создал следующий минимальный воспроизводящий пример:
echo OPENSSL_VERSION_TEXT;
require 'vendor/autoload.php';
$fetch = new \ParagonIE\Certainty\RemoteFetch('/tmp/');
$latestBundle = $fetch->getLatestBundle();
$context = stream_context_create(
[
'ssl' => array(
'cafile' => $latestBundle->getFilePath(),
'SNI_enabled' => true,
)
]
);
$url = 'https://example.com:8080/x/y';
echo file_get_contents($url . '?wsdl', false, $context);
я использую https://github.com/paragonie/certainty чтобы получить последние CAcerts.
Я получаю следующую ошибку
OpenSSL 1.0.2g 1 Mar 2016
PHP Warning: file_get_contents():
SSL operation failed with code 1. OpenSSL Error messages:
error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert
internal error in /tmp/test/test.php on line 20
PHP Warning: file_get_contents(): Failed to enable crypto in
/tmp/test/test.php on line 20
PHP Warning: file_get_contents(https://example.com:8080/x/y?
wsdl): failed to open stream: operation failed in
/tmp/test/test.php on line 20
Что здесь не так?
К сожалению, я не могу поделиться URL-адресом (он все равно находится за брандмауэром).
Доступ к нему с помощью curl —insecure работает — но я действительно хотел бы правильно проверить сертификат CA
РЕДАКТИРОВАТЬ
SSLyze выводит это:
РЕЗУЛЬТАТЫ СКАНИРОВАНИЯ, К примеру, .COM:8080 -> -------------------------------------------------- ---- * TLSV1_1 Cipher Suites: Вперед Секретность ОК - Поддерживается RC4 в норме - не поддерживается Предпочтительно: TLS_DHE_RSA_WITH_AES_256_CBC_SHA 256 бит Принято: TLS_RSA_WITH_AES_256_CBC_SHA 256 бит TLS_DH_anon_WITH_AES_256_CBC_SHA ANONYMOUS TLS_DHE_RSA_WITH_AES_256_CBC_SHA 256 бит Не определено - произошла непредвиденная ошибка: TLS_DHE_DSS_WITH_AES_256_CBC_SHA OpenSSLError - ошибка: 14094438: процедуры SSL: ssl3_read_bytes: внутренняя ошибка оповещения tlsv1 * TLSV1 Cipher Suites: Вперед Секретность ОК - Поддерживается RC4 в норме - не поддерживается Предпочтительно: TLS_DHE_RSA_WITH_AES_256_CBC_SHA 256 бит Принято: TLS_RSA_WITH_AES_256_CBC_SHA 256 бит TLS_DH_anon_WITH_AES_256_CBC_SHA ANONYMOUS TLS_DHE_RSA_WITH_AES_256_CBC_SHA 256 бит Не определено - произошла непредвиденная ошибка: TLS_DHE_DSS_WITH_AES_256_CBC_SHA OpenSSLError - ошибка: 14094438: процедуры SSL: ssl3_read_bytes: внутренняя ошибка оповещения tlsv1 * Сжать сжатие: ОК - Сжатие отключено * Справочная информация: содержание Отпечаток SHA1: c2b3ce5b0905caa2ec5998aacf074f99cffb0207 Общее имя: example.com Эмитент: Thawte TLS RSA CA G1 Серийный номер: 10361996092389695445524615643169842847 Не раньше: 2018-12-05 00:00:00 Не после: 2020-12-04 12:00:00 Алгоритм подписи: sha256 Алгоритм открытого ключа: RSA Размер ключа: 2048 Экспонент: 65537 (0x10001) Альтернативные имена субъектов DNS: ['example.com'] Доверять Проверка имени хоста: ОК - сертификат соответствует example.com Android CA Store (9.0.0_r3): FAILED - сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента iOS CA Store (11): FAILED - сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента Java CA Store (jre-10.0.2): FAILED - сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента MacOS CA Store (High Sierra): FAILED - сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента Mozilla CA Store (2018-08-23): СБОЙ - Сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента Windows CA Store (2018-08-04): СБОЙ - сертификат НЕ Доверенный: невозможно получить сертификат локального эмитента Symantec 2018 Устаревший: ОК - Сертификат не выдан Symantec Полученная цепочка: example.com Проверенная цепочка: ОШИБКА - Не удалось создать проверенную цепочку (сертификат ненадежен?) Полученная цепочка содержит привязку: ОШИБКА - Не удалось создать проверенную цепочку (сертификат не является доверенным?) Полученный цепной заказ: ОК - заказ действителен Проверенная цепочка содержит SHA1: ОШИБКА - Не удалось создать проверенную цепочку (сертификат ненадежен?) расширения OCSP Must-Staple: НЕ ПОДДЕРЖИВАЕТСЯ - расширение не найдено Прозрачность сертификата: ОК - 3 SCT включены OCSP Сшивание НЕ ПОДДЕРЖИВАЕТСЯ - сервер не отправил ответ OCSP * OpenSSL CCS Инъекция: ОК - Не уязвим для инъекции OpenSSL CCS * SSLV3 Cipher Suites: Сервер отклонил все комплекты шифров. * SSLV2 Cipher Suites: Сервер отклонил все комплекты шифров. * Поддержка Возобновления: С идентификаторами сеансов: OK - поддерживается (5 успешных, 0 неудачных, 0 ошибок, 5 попыток). С билетами TLS: НЕ ПОДДЕРЖИВАЕТСЯ - билет TLS не назначен. * Атаки понижения рейтинга: TLS_FALLBACK_SCSV: VULNERABLE - Набор шифров сигнализации не поддерживается * TLSV1_3 Cipher Suites: Сервер отклонил все комплекты шифров. * OpenSSL Heartbleed: ОК - Не уязвим для Heartbleed * TLSV1_2 Cipher Suites: Вперед Секретность ОК - Поддерживается RC4 в норме - не поддерживается Предпочтительно: TLS_RSA_WITH_AES_256_CBC_SHA 256 бит Принято: TLS_RSA_WITH_AES_256_CBC_SHA 256 бит TLS_DH_anon_WITH_AES_256_CBC_SHA ANONYMOUS TLS_DHE_RSA_WITH_AES_256_CBC_SHA 256 бит Не определено - произошла непредвиденная ошибка: TLS_DHE_DSS_WITH_AES_256_CBC_SHA OpenSSLError - ошибка: 14094438: процедуры SSL: ssl3_read_bytes: внутренняя ошибка оповещения tlsv1 * Пересмотр сессии: Инициированное клиентом повторное согласование: Уязвимые - сервер учитывает повторные переговоры, инициированные клиентом Безопасное повторное согласование: ОК - Поддерживается * ROBOT Attack: Хорошо - не уязвимы Сканирование завершено за 9,31 с
Внутренняя ошибка устраняется следующим образом:
$context = stream_context_create(
[
'ssl' => array(
'cafile' => $latestBundle->getFilePath(),
'SNI_enabled' => true,
'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:SSLv3:SSLv2',
'verify_peer' => false,
'verify_peer_name' => false,
'crypto_disable_compression' => true,
'method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
'verify_depth' => 10,
)
]
);
Но все же я не могу проверить сертификат CA.
В Chrome все работает нормально.
Это потому, что Chrome делает несколько обходных путей, смотрите https://security.stackexchange.com/questions/199963/certificate-works-in-chrome-firefox-but-not-with-curl-unable-to-get-local-is
Поэтому я должен ждать, пока цепь не будет настроена правильно.
Других решений пока нет …