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)
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:
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:
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.
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