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.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    Il linguaggio Php

    FAQ