WEB server HTTPS


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

Avviso certificato non sicuro

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)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *