LoginSignup
16
18

More than 5 years have passed since last update.

(初心者)SSLソケット通信

Posted at

はじめに

SSLのソケット通信を使ったことがなかったので、実際に動かした結果をここにまとめておきます。

環境

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

準備

証明書と公開鍵の作成

以下のページを参考に、証明書と公開鍵をOpenSSLで作成した。
http://qiita.com/marcy-terui/items/2f63d7f170ff82531245

├── keys
│   ├── server.crt
│   ├── server.csr  ※未使用
│   └── server.key

実装

以下のページを参考に、コードを作成した。
https://docs.python.org/2/library/ssl.html
17.3.5.2. クライアントサイドの処理
17.3.5.3. サーバーサイドの処理

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

結果

サーバ側
$ python ssl_server.py 
---------------------
HEAD / HTTP/1.0
Host: linuxfr.org



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


クライアント側
$ python ssl_client.py 
{}
['']
$ 

今後

今後は、SSLのパケット通信のキャプチャ&リプレイを実験し、
SSLで動作している通信のスタブ作成に挑戦してみたいと思います。

参考

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

16
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18