30
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Ubuntu16.04.5】PythonのFlaskをHTTPS化

Posted at

はじめに

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]
(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)

30
29
3

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
30
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?