Come controllare la data di scadenza del certificato SSL di un sito tramite PHP
Questo script PHP ha l'obiettivo di ottenere e mostrare la data di scadenza dei certificati SSL di un elenco di siti web.
L'elenco dei siti web da controllare è specificato in un array. Lo script PHP si connette a ciascun sito nell'elenco, legge il certificato SSL, ne estrae la data di scadenza e la visualizza in una pagina HTML
<?
function getSSLCertificateExpiryDate($domain) {
$get = stream_context_create([
"ssl" => [
"capture_peer_cert" => true,
"verify_peer" => false,
"verify_peer_name" => false,
],
]);
$read = @stream_socket_client(
"ssl://{$domain}:443",
$errno,
$errstr,
30,
STREAM_CLIENT_CONNECT,
$get
);
if (!$read) {
return "Errore: $errstr ($errno)";
}
$cert = stream_context_get_params($read);
fclose($read);
$certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
return date('Y-m-d', $certinfo['validTo_time_t']);
}
$sites = [
"www.google.com",
"www.facebook.com",
"www.youtube.com",
];
foreach ($sites as $site) {
$expiryDate = getSSLCertificateExpiryDate($site);
echo "<p>Il certificato SSL di $site scade il: $expiryDate</p>";
}
?>
La spiegazione
Ecco una spiegazione dettagliata di come funziona:
La funzione getSSLCertificateExpiryDate
Definisco la funzione `getSSLCertificateExpiryDate` che prende come parametro un dominio (`$domain`), ovvero il nome di dominio del sito.
La funzione crea un contesto di stream con le opzioni SSL configurate per catturare il certificato peer (`capture_peer_cert`), ma senza verificare il peer e il nome del peer (`verify_peer` e `verify_peer_name` sono impostati su `false`).
function getSSLCertificateExpiryDate($domain) {
$get = stream_context_create([
"ssl" => [
"capture_peer_cert" => true,
"verify_peer" => false,
"verify_peer_name" => false,
],
]);
La connessione al nome di dominio
Viene tentata una connessione socket al dominio sulla porta 443 (HTTPS).
Se la connessione fallisce, viene restituito un errore contenente il numero (`$errno`) e la descrizione (`$errstr`).
$read = @stream_socket_client(
"ssl://{$domain}:443",
$errno,
$errstr,
30,
STREAM_CLIENT_CONNECT,
$get
);
Se la connessione non riesce (`$read` è falso), la funzione restituisce un messaggio di errore.
if (!$read) {
return "Errore: $errstr ($errno)";
}
Recupero e parsing del certificato SSL
Se la connessione è riuscita, vengono recuperati i parametri del contesto di stream, inclusi i dettagli del certificato SSL.
Il certificato viene parsato usando `openssl_x509_parse` per ottenere le informazioni del certificato.
La data di scadenza del certificato viene estratta (`validTo_time_t`) e formattata come `Y-m-d`.
$cert = stream_context_get_params($read);
fclose($read);
$certinfo = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
return date('Y-m-d', $certinfo['validTo_time_t']);
L'elenco dei siti da verificare
Viene definito un array di siti web per i quali si vuole verificare la data di scadenza del certificato SSL.
$sites = [
// elenco dei siti web
"www.google.com",
"www.facebook.com",
"www.youtube.com",
];
Il ciclo per verificare ciascun sito.
Per ciascun sito nell'array, viene chiamata la funzione `getSSLCertificateExpiryDate`.
La data di scadenza viene stampata in un paragrafo HTML.
foreach ($sites as $site) {
$expiryDate = getSSLCertificateExpiryDate($site);
echo "<p>Il certificato SSL di $site scade il: $expiryDate</p>";
}
In sintesi, questo script PHP si connette a ciascun sito nell'elenco, recupera il certificato SSL, estrae la data di scadenza e la visualizza in una pagina HTML.
E così via.