Bonsoir,
Je cherche à créer un logiciel devant communiquer sur le réseau local. J’ai choisi pour cela Python, et du chiffrement SSL. Mais je suis un grand débutant, et je bloque sur un point.
J’ai réussi à faire fonctionner ensemble deux scripts (client et serveur): le client envoie un message au serveur, qui l’affiche. Cependant je ne parviens pas à faire en sorte que le client puisse envoyer plusieurs messages: il faut que je le relance pour qu’un autre message puisse être envoyé. Dans l’exemple ci-dessous, "coucou" n’est pas reçu par le serveur.
Voici le code du client et du serveur. J’utilise pour ce test un certificat autosigné, qui est également utilisé pour se vérifier lui-même…
Client:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import socket, pickle, pprint, ssl host="192.168.0.2" def client(): context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) context.verify_mode = ssl.CERT_REQUIRED context.check_hostname = False context.load_verify_locations("./ssl_cert.pem") print("context ok") conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=host) print("socket ok") conn.connect((host, 12345)) print("connection ok") cert = conn.getpeercert() pprint.pprint(cert) conn.sendall(pickle.dumps("Hello how are you?",0)) conn.sendall(pickle.dumps("coucou",0)) client() |
Serveur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import socket, ssl, pickle def debug(text): print(text) def deal_with_client(connstream): print("deal_with_client") data = connstream.recv(1024) # empty data means the client is finished with us while data: if not do_something(connstream, data): # we'll assume do_something returns False # when we're finished with client break data = connstream.recv(1024) # finished with client def do_something(stream, data): print(pickle.loads(data)) def server(): context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile="ssl_cert.pem", keyfile="ssl_key.pem") bindsocket = socket.socket() bindsocket.bind(('0.0.0.0', 12345)) bindsocket.listen(5) debug("bindsocket") while True: print ("boucle") newsocket, fromaddr = bindsocket.accept() try: connstream = context.wrap_socket(newsocket, server_side=True) try: print ("attente?") deal_with_client(connstream) #print ("on ferme la connection...") #connstream.close() finally: connstream.shutdown(socket.SHUT_RDWR) connstream.close() except: print("connexion échouée") server() |
Je me suis basé sur la documentation Python officielle, mais dans les exemples ils n’envoient qu’un seul message.
J’espère que vous pourrez m’aider! Merci!