Go: verificare il certificato SSL di un sito web remoto

La sicurezza su Internet è una preoccupazione sempre crescente, specialmente quando si tratta della trasmissione di dati sensibili. Uno dei modi più comuni per garantire la sicurezza delle comunicazioni web è l'utilizzo di certificati SSL (Secure Sockets Layer) o il loro successore, i certificati TLS (Transport Layer Security). Questi certificati crittografano le comunicazioni tra il tuo browser e il server web, proteggendo i dati da potenziali attacchi di intercettazione o manipolazione.

Tuttavia, per sfruttare appieno i benefici della sicurezza SSL/TLS, è fondamentale assicurarsi che il certificato SSL di un sito remoto sia valido e attendibile. In questo articolo, esploreremo come verificare la validità di un certificato SSL utilizzando il linguaggio di programmazione Go.

Importare le librerie necessarie

Per iniziare, dovrai importare le seguenti librerie Go:


import (
    "crypto/tls"
    "fmt"
    "net"
)

La libreria crypto/tls è fondamentale per lavorare con i certificati SSL/TLS in Go, mentre le librerie fmt e net ci aiuteranno nella manipolazione e nell'analisi dei dati.

Esempio di verifica di un certificato SSL

Di seguito è riportato un esempio di codice Go per verificare la validità di un certificato SSL di un sito web remoto:


func main() {
    // Indirizzo e porta del sito web remoto
    remoteAddr := "example.com:443"

    // Connessione al sito web remoto
    conn, err := net.Dial("tcp", remoteAddr)
    if err != nil {
        fmt.Println("Errore nella connessione al sito web:", err)
        return
    }
    defer conn.Close()

    // Configurazione del client TLS
    config := &tls.Config{InsecureSkipVerify: true} // Ignora la verifica del certificato (DA NON UTILIZZARE IN AMBIENTI PRODUTTIVI)
    tlsConn := tls.Client(conn, config)

    // Handshake TLS con il sito web remoto
    if err := tlsConn.Handshake(); err != nil {
        fmt.Println("Errore nel handshake TLS:", err)
        return
    }

    // Ottieni il certificato del sito web remoto
    certificate := tlsConn.ConnectionState().PeerCertificates[0]

    // Verifica la validità del certificato
    if err := certificate.VerifyHostname("example.com"); err != nil {
        fmt.Println("Certificato non valido:", err)
        return
    }

    // Stampa le informazioni sul certificato
    fmt.Println("Certificato valido:")
    fmt.Println("Soggetto:", certificate.Subject.CommonName)
    fmt.Println("Emittente:", certificate.Issuer.CommonName)
    fmt.Println("Scadenza:", certificate.NotAfter)
}

Nell'esempio sopra, stiamo verificando la validità del certificato SSL del sito web "example.com" utilizzando una connessione TLS. Tuttavia, notare che stiamo utilizzando InsecureSkipVerify: true nella configurazione del client TLS, il che significa che stiamo ignorando la verifica del certificato. Questa opzione non dovrebbe essere utilizzata in un ambiente di produzione, ma è utile per scopi di apprendimento o debug.

Conclusioni

La verifica della validità dei certificati SSL è un aspetto cruciale per garantire la sicurezza delle comunicazioni web. Con Go, è possibile eseguire questa verifica in modo semplice ed efficace utilizzando la libreria crypto/tls. Tuttavia, è importante ricordare di non utilizzare l'opzione InsecureSkipVerify in un ambiente di produzione, poiché ciò potrebbe compromettere la sicurezza delle tue comunicazioni web. Utilizza sempre un metodo di verifica appropriato per garantire che i tuoi certificati SSL siano validi e attendibili.

Torna su