2012-06-29 14 views
5

Solo cercando di configurare un semplice server SSL. Non ho mai avuto nulla che SSL funzioni per me in passato. Ho una comprensione approssimativa di come i certificati SSL e la firma.Python Simple SSL Socket Server

Il codice è semplice

import socket, ssl 

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) 
context.load_cert_chain(certfile="mycertfile") ############### 

bindsocket = socket.socket() 
bindsocket.bind(('', 2099)) 
bindsocket.listen(5) 

while True: 
    newsocket, fromaddr = bindsocket.accept() 
    sslsoc = context.wrap_socket(newsocket, server_side=True) 
    request = sslsoc.read() 
    print(request) 

La linea in là con il ### s dopo che è quella che isnt di lavoro. Non so cosa devo fare con openssl per generare un file PEM che funzionerà qui.

Qualcuno può illuminarmi su come far funzionare questo semplice socket.

A proposito, questo NON è utilizzato per HTTP.

+0

Se siete suscettibili di utilizzare contorto, c'è un buon esempio che utilizza OpenSSL: http://twistedmatrix.com/documents/current/core/howto/ssl.html Sembra che richiede un certificato e una chiave pubblica, in cui il certificato è firmato con la coppia privata della chiave pubblica. – jozzas

+0

Questo è buono e sembra piuttosto semplice, ma tutto ciò di cui ho bisogno sono i comandi per generare il file corretto da usare. L'ho provato poco fa ma ho avuto degli errori molto strani. Ovviamente non l'ho firmato correttamente o non ho usato il file giusto. – Caprin

+0

Sembra che ci siano un sacco di tutorial per questo, hai provato a seguire questo, per esempio? http://devsec.org/info/ssl-cert.html – jozzas

risposta

8

è possibile utilizzare questo comando per generare un certificato auto-firmato

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem 

quadro OpenSSL vi chiederà di inserire alcune informazioni, come il tuo paese, città, ecc basta seguire le istruzioni, e si otterrà un file cert.pem. il file di output avrà sia la tua chiave privata RSA, con la quale puoi generare la tua chiave pubblica, sia il certificato. il file di output è simile al seguente:

-----BEGIN RSA PRIVATE KEY----- 
# your private key 
-----END RSA PRIVATE KEY----- 
-----BEGIN CERTIFICATE----- 
# your certificate 
-----END CERTIFICATE----- 

basta caricarla, e il modulo ssl gestirà il resto per voi:

context.load_cert_chain(certfile="cert.pem", keyfile="cert.pem") 

proposito, c'è senza "SSLContext" in python2. per i ragazzi che utilizzano python2, basta assegnare il file PEM quando la confezione presa:

newsocket, fromaddr = bindsocket.accept() 
connstream = ssl.wrap_socket(newsocket, 
          server_side=True, 
          certfile="cert.pem", 
          keyfile="cert.pem", 
          ssl_version=YOUR CHOICE) 

disponibile la versione SSL: ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23. se non ne hai idea, ssl.PROTOCOL_SSLv23 potrebbe essere la tua scelta in quanto fornisce la massima compatibilità con altre versioni.

+1

per creare 'context', chiama la funzione' ssl.create_default_context' (funziona anche sulle recenti versioni di Python 2). – jfs

+0

So che questo è un vecchio post, ma a causa della vulnerabilità di POODLE nessuno dovrebbe consigliare l'uso di SSLv3 su TLS. Maggiori informazioni su https://en.wikipedia.org/wiki/POODLE – fileinster