>>> LINK A PAGINA AGGIORNATA <<<
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
- .
Connessione HTTPS
Una connessione HTTPS consente il dialogo criptato tra server e browser, ed è l’unico tipo di connessione accettabile se vi sono dati sensibili da trasmettere, come password, informazioni di pagamento ecc.
Trasformiamo il server minimale dell’articolo Python HTTPServer in un server HTTPS. Bisogna importare il modulo ssl, e “modificare” il socket originale creando un nuovo socket in grado di gestire in modo trasparente l’HTTPS.
import ssl
server.socket = ssl.wrap_socket ( server.socket, keyfile='/percorso/chiave.pem', certfile='/percorso/certificato.pem', server_side=True ssl_version=ssl.PROTOCOL_TLSv1)
Certificati
Occorre una coppia di file chiave/certificato normalmente rilasciati da un’autorità certificatrice. Questi file possono essere anche generati in locale con il programma OpenSSL. Per ottenere un certificato valido per un anno, da terminale Linux è sufficiente scrivere:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "/percorso/chiave.pem" -out "/percorso/certificato.pem"
Durante la creazione vengono richiesti alcuni dati:
- Country Name (IT)
- State or Province Name (Italia)
- Locality Name (città)
- Organization Name
- Organizational Unit Name (Amministrazione)
- Common Name (sito o nome)
- Email Address
NOTA: un certificato prodotto localmente è tecnicamente funzionante, ma alla prima connessione il browser avviserà che il certificato proviene da una fonte non sicura. Per proseguire è necessario dare conferma, eventualmente creando un’eccezione se il browser lo richiede. Questo è quello che appare in Firefox Quantum:
Porta
La porta in ascolto di un server HTTPS normalmente è la 443. Usando altri valori, come 4443, è possibile avviare il server anche senza i permessi di amministratore.
Il nuovo server “sicuro”
from http.server import HTTPServer from http.server import BaseHTTPRequestHandler import ssl #___________________________________________________________ pagina = u'''<!DOCTYPE html> <html lang="it"> <head> <meta charset="UTF-8"> </head> <body> HTTPS OK </body> </html>''' #___________________________________________________________ def trasmetti(hdl, codice, tipo, contenuto): hdl.send_response(codice) hdl.send_header('Content-Type', tipo) hdl.send_header('Content-Length', len(contenuto)) hdl.end_headers() hdl.wfile.write(contenuto) hdl.wfile.flush() hdl.connection.shutdown(1) #___________________________________________________________ class Gestore(BaseHTTPRequestHandler): def do_GET(self): contenuto = pagina.encode('utf-8') tipo = 'text/html' trasmetti(self, 200, tipo, contenuto) def do_POST(self): pass #___________________________________________________________ indirizzo = '', 4443 server = HTTPServer(indirizzo, Gestore) server.socket = ssl.wrap_socket( server.socket, keyfile='/home/utente/chiave.pem', certfile='/home/utente/certificato.pem', server_side=True ssl_version=ssl.PROTOCOL_TLSv1) try: server.serve_forever() except KeyboardInterrupt: server.socket.close()
NOTA: in Python2 importare da BaseHTTPServer invece che da http.server
Riferimenti
https://www.chimerarevo.com/internet/generare-certificati-per-server-tls-ssl-232348/
(7/8/2018)