false], 'HTTPS n\'est pas actif — c\'est une faille critique' ); } $host = parse_url(site_url(), PHP_URL_HOST) ?? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'] ?? 'localhost')); $context = stream_context_create(['ssl' => ['capture_peer_cert' => true]]); $socket = @stream_socket_client('ssl://' . $host . ':443', $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $context); if (!$socket) { return new CheckResult( 'ssl', 'warn', 4, 8, 'high', ['active' => true, 'error' => 'Impossible de récupérer les détails du certificat'], 'Vérifiez la validité du certificat SSL' ); } $params = stream_context_get_params($socket); $cert = openssl_x509_parse($params['options']['ssl']['peer_certificate']); fclose($socket); if (!$cert) { return new CheckResult( 'ssl', 'warn', 4, 8, 'high', ['active' => true, 'error' => 'Certificat invalide'], 'Le certificat SSL semble invalide' ); } $validTo = $cert['validTo_time_t'] ?? 0; $daysRemaining = (int) round(($validTo - time()) / 86400); $protocol = sanitize_text_field(wp_unslash($_SERVER['SSL_PROTOCOL'] ?? 'TLS')); $issuer = is_array($cert['issuer'] ?? null) ? ($cert['issuer']['O'] ?? 'Unknown') : 'Unknown'; return SslScorer::score($daysRemaining, $protocol, $issuer); } catch (\Throwable $e) { return new CheckResult( 'ssl', 'skip', 8, 8, 'info', ['error' => $e->getMessage()], 'Vérification ignorée (exception interne) : ' . $e->getMessage() ); } } }