Posted at

【Ubuntu16.04.5】PythonのFlaskをHTTPS化


はじめに

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権限で行ってください。


app.py

# 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

Running Your Flask Application Over HTTPS - miguelgrinberg.com