RFC 2818 - HTTP Over TLS (HTTPS) - Esempi pratici
Esempi pratici
Connessione HTTPS completa
Operazioni del client:
1. Analizzare l'URI: https://www.example.com/page.html
→ Hostname: www.example.com
→ Porta: 443 (predefinita)
2. Connessione TCP a www.example.com:443
3. Handshake TLS:
ClientHello →
← ServerHello + Certificate
Verificare l'hostname nel certificato
...handshake completato...
4. Inviare richiesta HTTP crittografata:
GET /page.html HTTP/1.1
Host: www.example.com
5. Ricevere risposta HTTP crittografata:
HTTP/1.1 200 OK
Content-Length: 1234
...
6. Chiudere la connessione:
Inviare closure_alert
Chiudere la connessione TCP
Esempio di verifica del certificato
# Esempio Python (concettuale)
import ssl
import socket
# Creare contesto SSL
context = ssl.create_default_context()
# Connettersi al server
sock = socket.create_connection(('www.example.com', 443))
ssock = context.wrap_socket(sock, server_hostname='www.example.com')
# wrap_socket verifica automaticamente:
# 1. La catena di certificati è valida
# 2. L'hostname corrisponde
# 3. Il certificato non è scaduto
# Ottenere informazioni sul certificato
cert = ssock.getpeercert()
print(f"Subject: {cert['subject']}")
print(f"Issuer: {cert['issuer']}")
print(f"SANs: {cert.get('subjectAltName', [])}")
Gestione degli errori comuni
Errore 1: Mancata corrispondenza del nome host del certificato
Certificate Hostname Mismatch
- Certificato: *.example.com
- Accesso: www.different.com
→ Terminare la connessione o avvisare l'utente
Errore 2: Certificato scaduto
Certificate Expired
- Not After: 2023-12-31
- Corrente: 2024-01-01
→ Rifiutare la connessione
Errore 3: Certificato autofirmato
Self-Signed Certificate
- Non nell'elenco delle CA attendibili
→ Avvisare l'utente o rifiutare
Errore 4: Catena di certificati incompleta
Incomplete Certificate Chain
- Manca il certificato intermedio
→ Impossibile verificare, rifiutare la connessione