Bonjour à tous,

Je suis actuellement entrain d'essayer de créer un client-serveur grâce à la library "socket" et d'encapsuler celui-ci dans "ssl" afin de chiffrer les communications.

J'ai donc créer deux fichiers (client / server), mon objectif est de garder quelques choses de très simples, malheureusement, je n'arrive pas à mettre en place correctement SSL.
Tout d'abord, afin de générer les clés (priv/pub) et le certificat côté serveur, j'utilise ces commandes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj '/CN=test.test'
$ openssl rsa -in key.pem -pubout > key.pub
Ensuite, voici le code de mon client ainsi que de mon serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Server
import socket
import ssl
 
 
if __name__ == "__main__":
    # Creating the socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
    # Wrapping it in a SSL object
    s = ssl.wrap_socket(s, server_side=True, keyfile="key.pem", certfile="cert.pem")
 
    # Waiting for incoming connections
    s.bind(("127.0.0.1", 37190))
    s.listen()
 
    # Accepting the first incoming connection
    client, addr = s.accept()
    print(client.recv(1024).decode("utf-8"))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Client
import socket
import ssl
 
 
if __name__ == "__main__":
    # Creating the socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
    # Wrapping it in a SSL object
    s = ssl.wrap_socket(s, keyfile="key.pub", certfile="cert.pem")
 
    # Trying to connect to server
    s.connect(("127.0.0.1", 37190))
 
    # Sending hello !
    s.send("Hello world !".encode("utf-8"))
Voici l'erreur que j'obtiens (côté client) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Traceback (most recent call last):
  File "client.py", line 11, in <module>
    s = ssl.wrap_socket(s, keyfile="key.pub", certfile="cert.pem")
  File "/usr/lib/python3.8/ssl.py", line 1402, in wrap_socket
    context.load_cert_chain(certfile, keyfile)
ssl.SSLError: [SSL] PEM lib (_ssl.c:4067)
J'ai lu la documentation de SSL et pense devoir me diriger vers une définition de contexte à la main mais ne sait trop comment m'y prendre.
De plus, mon certificat est auto-signé et je souhaite que cela fonctionne comme cela

Merci d'avance pour toute aide quelle qu'elle soit