25
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
25
Help us understand the problem. What are the problem?