まったり技術ブログ

Technology is power.

PythonだけでHTTPSサーバ

Secure属性を付与したCookieの取り扱いなど簡単な検証で重宝しています。

HTTPS通信にしようするサーバ証明書の作成
# openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
Webサーバ側のコード

ここではWebフレームワークのbottleを使用します。

import sys, os, datetime
from bottle import route, run, request, HTTPResponse, ServerAdapter

class SSLWebServer(ServerAdapter):

def run(self, handler):
from gevent.pywsgi import WSGIServer
srv = WSGIServer((self.host, self.port), handler,
certfile='./server.pem',
keyfile='./server.pem')
srv.serve_forever()

@route('/', method='GET')
@route('/index', method='GET')
def index():
body = "0"
if request.get_cookie("counter"):
body = str(int(request.get_cookie("counter")) + 1)
res = HTTPResponse(status=200, body=body)
res.set_cookie('counter', body, secure=1)
return res

run(host='127.0.0.1', port=8080, server=SSLWebServer)
ブラウザで確認

f:id:motikan2010:20161225194304p:plain

curlコマンドで確認

-k オプションでHTTPS通信を行います。

# curl -v -k https://127.0.0.1:8080/
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: Internet Widgits Pty Ltd
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 1
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: counter=0; Secure
< Date: Sun, 25 Dec 2016 10:31:46 GMT
<
* Connection #0 to host 127.0.0.1 left intact
0

参考:dgtool: SSL encryption in python bottle