[PYTHON] (Débutant) Communication par socket SSL

introduction

Je n'ai jamais utilisé la communication par socket SSL, voici donc le résultat de l'opération réelle.

environnement

OS X El Capitan Python 2.7.11 OpenSSL 0.9.8zh 14 Jan 2016

Préparation

Créer un certificat et une clé publique

J'ai créé le certificat et la clé publique avec OpenSSL en me référant à la page suivante. http://qiita.com/marcy-terui/items/2f63d7f170ff82531245

├── keys
│   ├── server.crt
│   ├── server.csr * inutilisé
│   └── server.key

la mise en oeuvre

J'ai créé le code en me référant à la page suivante. https://docs.python.org/2/library/ssl.html 17.3.5.2. Traitement côté client 17.3.5.3. Traitement côté serveur

ssl_server.py


import socket, ssl

URL = '127.0.0.1'
PORT = 10023

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="keys/server.crt", keyfile="keys/server.key")

bindsocket = socket.socket()
bindsocket.bind((URL, 10023))
bindsocket.listen(5)

def do_something(connstream, data):
    print '---------------------'
    print data + '\n'
    print '---------------------'
    print

def deal_with_client(connstream):
    data = connstream.read()
    # null 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.read()
    # finished with client

while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        deal_with_client(connstream)
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()

ssl_client.py


import ssl
import socket
import pprint

URL = '127.0.0.1'
PORT = 10023

context = ssl.create_default_context()
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.verify_mode = ssl.CERT_NONE 
context.check_hostname = False
conn = context.wrap_socket(socket.socket(socket.AF_INET),
           server_hostname=URL)
conn.connect((URL, PORT))
cert = conn.getpeercert()
pprint.pprint(cert)
conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
pprint.pprint(conn.recv(1024).split(b"\r\n"))

résultat

Du côté serveur


$ python ssl_server.py 
---------------------
HEAD / HTTP/1.0
Host: linuxfr.org



---------------------


Côté client


$ python ssl_client.py 
{}
['']
$ 

à partir de maintenant

À l'avenir, nous expérimenterons la capture et la relecture de la communication par paquets SSL. Je voudrais essayer de créer un talon de communication qui fonctionne avec SSL.

référence

https://docs.python.org/2/library/ssl.html http://qiita.com/marcy-terui/items/2f63d7f170ff82531245

Recommended Posts

(Débutant) Communication par socket SSL
Communication de socket avec Python
Communication TCP à l'aide du module Socket-Python3
Communication de socket avec Python LEGO Mindstorms
Module de socket Python 3 et flux de communication de socket
Communication socket et traitement multi-thread par Python
Communication socket par langage C et Python