[PYTHON] (Anfänger) SSL-Socket-Kommunikation

Einführung

Ich habe noch nie SSL-Socket-Kommunikation verwendet, daher hier das Ergebnis der tatsächlichen Operation.

Umgebung

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

Vorbereitung

Erstellen eines Zertifikats und eines öffentlichen Schlüssels

Ich habe das Zertifikat und den öffentlichen Schlüssel mit OpenSSL erstellt, indem ich auf die folgende Seite verwiesen habe. http://qiita.com/marcy-terui/items/2f63d7f170ff82531245

├── keys
│   ├── server.crt
│   ├── server.csr * Nicht verwendet
│   └── server.key

Implementierung

Ich habe den Code unter Bezugnahme auf die folgende Seite erstellt. https://docs.python.org/2/library/ssl.html 17.3.5.2. Client-seitige Verarbeitung 17.3.5.3. Serverseitige Verarbeitung

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"))

Ergebnis

Serverseite


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



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


Client-Seite


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

von jetzt an

In Zukunft werden wir mit der Erfassung und Wiedergabe der SSL-Paketkommunikation experimentieren. Ich möchte versuchen, einen Kommunikationsstub zu erstellen, der mit SSL arbeitet.

Referenz

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

Recommended Posts

(Anfänger) SSL-Socket-Kommunikation
Socket-Kommunikation mit Python
TCP-Kommunikation mit Socket-Modul-Python3
Socket-Kommunikation mit Python LEGO Mindstorms
Python 3-Socket-Modul und Socket-Kommunikationsfluss
Socket-Kommunikation und Multithread-Verarbeitung durch Python
Socket-Kommunikation in C-Sprache und Python