ファイナンス、情報通信技術、法律のスキル・アグリゲーション・サイト

Python Tornado で Secure WebSocket

Tornade Secure WebSocket (wss://)のサンプルプログラムです。接続するクライアントプログラムは、Python の websocket-client モジュールを利用した例と、HTML5 & JQuery を利用した例です。

SSL 証明書は、プライベート証明書を作成しました。手順については、「プライベート認証局でプライベート SSL/TLS 証明書を発行する」も参照してください。

なお、ブラウザでの確認は、CentOS 6 上の Firefox を利用しました。その際、 tlsv1 alert unknown ca というようなアラートが出たときの対応です。



# update-ca-trust enable
# cp ca.crt /etc/pki/ca-trust/source/anchors/
# update-ca-trust extract

また、 sslv3 alert bad certificate のようなアラートが出たときは、サーバ証明書の Common Name がドメイン名と一致しているか確認しました。

Secure WebSocket のサーバプログラム例(Tornado)

Tornado を利用した WebSocket サーバ例です。

http://www.tornadoweb.org/en/stable/websocket.html



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

class WSHandler(tornado.websocket.WebSocketHandler):
  clients = []
  def check_origin(self, origin):
    return True

  def open(self):
    WSHandler.clients.append(self)
    print "Connected.\n"

  def on_message(self, message):
    print "Received message:%s\n" % message
    for con in WSHandler.clients:
      con.write_message(message)

  def on_close(self):
    WSHandler.clients.remove(self)
    print "Closed.\n"

application = tornado.web.Application([
  (r"/ws", WSHandler),])

if __name__ == "__main__":
  http_server = tornado.httpserver.HTTPServer(
    application, ssl_options={
    "certfile": "server.crt",
    "keyfile":  "server.key",})
  http_server.listen(8888)
  tornado.ioloop.IOLoop.instance().start()

次に、Tornado のテンプレートを利用した例です。 HTML5 & JQuery の WebSocket クライアント例を index.html のファイル名で templates ディレクトリに保存します。templates ディレクトリは、 Python Tornado プログラムファイルを保存したディレクトリ内に作成します。



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import os

class MainHandler(tornado.web.RequestHandler):
  def get(self):
    self.render("index.html")

class WSHandler(tornado.websocket.WebSocketHandler):
  clients = []
  def check_origin(self, origin):
    return True

  def open(self):
    WSHandler.clients.append(self)
    print "Connected.\n"

  def on_message(self, message):
    print "Received message:%s\n" % message
    for con in WSHandler.clients:
      con.write_message(message)

  def on_close(self):
    WSHandler.clients.remove(self)
    print "Closed.\n"

settings = {
  "template_path": os.path.join(os.path.dirname(__file__), "templates"),
} 

application = tornado.web.Application([
  (r"/ws", WSHandler),
  (r"/", MainHandler),
], **settings)

if __name__ == "__main__":
  http_server = tornado.httpserver.HTTPServer(
    application, ssl_options={
    "certfile": "server.crt",
    "keyfile":  "server.key",})
  http_server.listen(8888)
  tornado.ioloop.IOLoop.instance().start()

Secure WebSocket のクライアントプログラム例

Python の websocket-client モジュールを利用した例です。

https://github.com/websocket-client/websocket-client



#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import ssl
from websocket import create_connection

ws = create_connection("wss://www.example.jp:8888/ws",
  sslopt={"cert_reqs": ssl.CERT_NONE,
          "check_hostname": False})
 
if len(sys.argv) > 1:
  message = sys.argv[1]
else:
  message = "hello websocket!"
 
sndlen = ws.send(message)
rcvmsg = ws.recv()
print "Received:%s\n" % rcvmsg
 
ws.close()

次に、HTML5 & JQuery の WebSocket クライアント例です。チャットプログラムを簡略にしたようなデザインとしました。

Tornado のテンプレートを利用したサーバプログラム例の場合は、index.html のファイル名で templates ディレクトリに保存します。templates ディレクトリは、 Python Tornado プログラムファイルを保存したディレクトリ内に作成します。



<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>Tornado Chat Demo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
  <script>
function ws() {
  var data = {};
  $("#chat").prepend("<p>Websocket START</p>");
  var s = new WebSocket("wss://www.example.jp:8888/ws");
  s.onerror = function() {
    $("#chat").prepend("<p>ERROR(/ws)</p>");
  }
  s.onopen = function() {
    $("#chat").prepend("<p>OPEN(/ws)</p>");
  }
  s.onmessage = function(e) {
    $("#chat").prepend("<p>" + e.data + "</p>");
  }
  $("#chatform").submit(function (evt) {
    var line = $("#chatform [type=text]").val()
    $("#chatform [type=text]").val("")
    s.send(line);
    return false;
  });
}
  </script>
 </head>
 <body>
  <div id="chat" style="width: 60em; height: 20em; overflow:auto; border: 1px solid black">
  </div>
  <form id="chatform">
  <p>Message</p>
  <input type="text" />
  <input type="submit" value="送信" />
  </form>
  <script>
window.onload = function() {
  $("#chat").prepend("<p>ONLOAD</p>");
  ws();
};
  </script>
 </body>
</html>

『Python Tornado で Secure WebSocket』を公開しました。

『人間がつながったことが、インターネットのいちばん大きな意義だ。 … あきらめなくなくてもすむ社会にしたい。 … その足場の台が、インターネットの役割だ。』(序章より)

角川インターネット講座1 インターネットの基礎 情報革命を支えるインフラストラクチャー (角川学芸出版全集) amazon.co.jp Kindle本

ファイナンシャル・プランニング
6つの係数

終価係数 : 元本を一定期間一定利率で複利運用したとき、将来いくら になるかを計算するときに利用します。

現価係数 : 将来の一定期間後に目標のお金を得るために、現在いくら の元本で複利運用を開始すればよいかを計算するときに利用します。

年金終価係数 : 一定期間一定利率で毎年一定金額を複利運用で 積み立て たとき、将来いくら になるかを計算するときに利用します。

年金現価係数 : 元本を一定利率で複利運用しながら、毎年一定金額を一定期間 取り崩し ていくとき、現在いくら の元本で複利運用を開始すればよいかを計算するときに利用します。

減債基金係数 : 将来の一定期間後に目標のお金を得るために、一定利率で一定金額を複利運用で 積み立て るとき、毎年いくら ずつ積み立てればよいかを計算するときに利用します。

資本回収係数 : 元本を一定利率で複利運用しながら、毎年一定金額を一定期間 取り崩し ていくとき、毎年いくら ずつ受け取りができるかを計算するときに利用します。

積み立て&取り崩しモデルプラン

積立金額→年金額の計算 : 年金終価係数、終価係数、資本回収係数を利用して、複利運用で積み立てた資金から、将来取り崩すことのできる年金額を計算します。

年金額→積立金額の計算 : 年金現価係数、現価係数、減債基金係数を利用して、複利運用で将来の年金プランに必要な資金の積立金額を計算します。

『インターネットの文化として、実際に動くものを重視するというプラグマティズム(実用主義)の徹底がある。 … インターネットはソフトウェアで動いており、その多くの部分がオープンソースだから …』(序章より)

角川インターネット講座2 ネットを支えるオープンソース ソフトウェアの進化 (角川学芸出版全集) amazon.co.jp Kindle本