LO SCAFFALE DEGLI HOBBY

Appunti On Line

AVVERTENZE da leggere attentamente


PYTHON

WEB server 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:

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/


All'indice principale | Al vecchio sito