[ 'verify_peer' => true, // Ключевой параметр: принудительная проверка сертификата сервера 'verify_peer_name' => true, // Проверка соответствия имени домена сертификату 'SNI_enabled' => true, // Включение SNI (обязательно для современных SSL) 'capture_peer_cert' => true, // Захват сертификата для анализа ] ]); // Попытка подключения $socket = @stream_socket_client( "ssl://{$domain}:{$port}", $errno, $errstr, 10, // Таймаут 10 секунд STREAM_CLIENT_CONNECT, $context ); if ($socket === false) { // Соединение не установлено, выводим информацию об ошибке echo "X Соединение не установлено!\n"; echo "Код ошибки (errno): {$errno}\n"; echo "Сообщение об ошибке: {$errstr}\n"; // Если errno = 0, это часто указывает на проблему с проверкой SSL-сертификата if ($errno === 0) { echo "\n! Подсказка: Код ошибки 0 обычно означает сбой проверки SSL-сертификата (например, отсутствие промежуточного сертификата или недоступность корневого сертификата в хранилище доверенных сертификатов PHP).\n"; echo "Попробуйте временно отключить проверку для подтверждения:\n"; echo "Измените 'verify_peer' => true на false и запустите снова. Если соединение установится, проблема именно в доверии к сертификату.\n"; } } else { echo "V Соединение успешно установлено (сертификат проходит проверку PHP).\n"; // Получение информации о сертификате $params = stream_context_get_params($socket); if (isset($params['options']['ssl']['peer_certificate'])) { $cert = openssl_x509_parse($params['options']['ssl']['peer_certificate']); echo "\nИнформация о сертификате:\n"; echo " Домен (CN): " . ($cert['subject']['CN'] ?? 'N/A') . "\n"; echo " Издатель: " . ($cert['issuer']['CN'] ?? 'N/A') . "\n"; echo " Действителен до: " . date('Y-m-d H:i:s', $cert['validTo_time_t']) . "\n"; } fclose($socket); }