Salut à tous,
pour un projet d'étude j'ai besoin de réaliser un serveur python acceptant le protocole https sécurisé et des scripts python (dans un cgi-bin par exemple).
J'avais auparavant réalisé un serveur réalisant presque mes souhaits, mais n'implémentant pas https.
Me voila partit dans les pérégrinations googleienne, mais rien (ou presque) n'a répondu à mon problème.
J'ai réalisé un serveur qui marche "presque", utilisant les classes suivantes :
from CGIHTTPServer import CGIHTTPRequestHandler
from M2Crypto.SSL.SSLServer import SSLServer
from M2Crypto import Rand, SSL
M2Crypto étant une classe permettant de gérer le ssl à priori.
Mais voila : tout marche sauf ... la lecture des scripts python ! pièce maitresse de mon projet ... en effet un segmentation fault le fait planter complètement. Cependant l'ouverture d'une page html classique ou une image fonctionne très bien... (bizarre...)
Je ne sais pas si vous avez une idée sur ce point, ou même si vous vous êtes déjà penché sur un tel problème, mais dans les deux cas, si vous pouvez m'aider ce serait d'une grande aide pour moi merci d'avance.
Je vous mets en annexe mon serveur pyton :
from CGIHTTPServer import CGIHTTPRequestHandler
from M2Crypto.SSL.SSLServer import SSLServer
from M2Crypto import Rand, SSL
import os
class HTTPS_Server(SSLServer):
def __init__(self, server_addr, handler, ssl_ctx):
SSLServer.__init__(self, server_addr, handler, ssl_ctx)
self.server_name = server_addr[0]
self.server_port = server_addr[1]
def finish(self):
self.request.set_shutdown(SSL.SSL_RECEIVED_SHUTDOWN | SSL.SSL_SENT_SHUTDOWN)
self.request.close()
def init_context(protocol, certfile, cafile, verify, verify_depth=10):
ctx=SSL.Context(protocol)
ctx.load_cert(certfile)
ctx.load_client_ca(cafile)
ctx.load_verify_info(cafile)
ctx.set_verify(verify, verify_depth)
ctx.set_allow_unknown_ca(1)
ctx.set_session_id_ctx('https_srv')
ctx.set_info_callback()
return ctx
if __name__ == '__main__':
Rand.load_file('../randpool.dat', -1)
ctx = init_context('sslv23', 'server.pem', 'ca.pem', SSL.verify_none)
ctx.set_tmp_dh('dh1024.pem')
os.chdir("pages" )
httpsd = HTTPS_Server(('', 9443), CGIHTTPRequestHandler, ctx)
httpsd.serve_forever()
Rand.save_file('../randpool.dat')
=========
Erreur lors de l'éxécution :
localhost.localdomain - - [08/Jun/2006 23:25:25] "GET / HTTP/1.1" 200 -
LOOP: SSL accept: before/accept initialization
LOOP: SSL accept: SSLv3 read client hello A
LOOP: SSL accept: SSLv3 write server hello A
LOOP: SSL accept: SSLv3 write change cipher spec A
LOOP: SSL accept: SSLv3 write finished A
LOOP: SSL accept: SSLv3 flush data
LOOP: SSL accept: SSLv3 read finished A
INFO: SSL accept: SSL negotiation finished successfully
localhost.localdomain - - [08/Jun/2006 23:25:26] "GET /cgi-bin/index.py HTTP/1.1" 200 -
close failed: [Errno 104] Connection reset by peer
Erreur de segmentation
Configuration personnelle :
- Linux Ubuntu Breezy Badger 2.6.12-10-686-smp
- python 2.4