はじめに
WebRTCとOpenCVを使ってリアルタイム映像処理を行おうとしていたところ、PythonのFlaskというフレームワークが便利そうなので使ってみることに。
ただWebRTC用にSSL化するのにちょっと手間取ったので備忘録の意味も含めて。
開発環境
- Ubuntu16.04.5(AWS)
- Python3.5.2
注意点
あくまで自分で遊ぶ用なので、セキュリティ等は一切考慮しておりません。そのため使う証明書もオレオレ証明書になります。
証明書作成
以下のコマンドからopensslのインストールとサーバ証明書と鍵を作成をします。
一応これで10年持つ証明書の完了です。どうせ無料期間終わったら解約するので関係ないですが。
$ sudo apt install openssl
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
これらのファイルは全て~/openssl
下に置いてあるものとします。
ソースコード
あとは以下のソースをホームディレクトリに設置して、実行したらhttps化されているはずです。portはお好きに。
ただし実行はroot権限で行ってください。
# coding: UTF-8
from flask import Flask, render_template, request, redirect, url_for, Response
@api.route("/")
def index():
return "test\n"
if __name__ == '__main__':
api.run(host='0.0.0.0', port=334, ssl_context=('openssl/server.crt', 'openssl/server.key'), threaded=True, debug=True)
もしかしたらopensslが入ってないと怒られるかもしれないのでその時は
sudo apt install python3-openssl
でインストールしてください。
ハマったところ
1.証明書の読み込み
この件について調べてみると大体以下のようなソースが出てくると思います。
from flask import Flask, render_template, request, redirect, url_for, Response
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain('openssl/server.crt', 'openssl/server.key')
@api.route("/")
def index():
return "test\n"
if __name__ == '__main__':
api.run(host='0.0.0.0', port=334, ssl_context=context, threaded=True, debug=True)
で、これをいざ実行してみようとすると
Traceback (most recent call last): File "app.py", line 14, in <module> context.load_cert_chain('openssl/sever.crt', 'openssl/server.key') FileNotFoundError: [Errno 2] No such file or directory
って怒られるんですよね・・・絶対パスに変えてみてもダメ。バージョンで引数変わったのだろうか。ちゃんとファイルはあるのに。
権限とかその辺も全部確認しました。というかそもそもssl_context=('openssl/server.crt', 'openssl/server.key')
で読み込めるんだから読めるはずだし。
2.Flaskの外部公開
AWSのサーバを使ってるのでサーバを外部公開する必要があります。
それでそこそこ詰まりました。以下を参考にしてください。
Flaskのサーバーはデフォルトだと公開されてない - Qiita
#おわりに
これで気兼ねなくWebRTCで遊べます。
そっちの方に関してもまたいつか書こうと思います。
#参考文献
[【flask】Webサーバーをhttps対応する方法 【お家IT#4】 - MotoJapan's Tech-Memo]
(http://motojapan.hateblo.jp/entry/2017/12/14/083635)
[Running Your Flask Application Over HTTPS - miguelgrinberg.com]
(https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https)