Django Framework の拡張機能のコレクションである Django Extensions を利用します。
このパッケージには管理コマンド、追加のデータベースフィールド、管理拡張機能などが含まれますが、その中で、RunServerPlus を使用して Django 開発サーバを HTTPS 化します。
現状・条件
Django Extensions をセットアップ
django-extensions パッケージをインストール
(py37) [admin@centos7 backend]$ pip install django-extensions Collecting django-extensions Downloading https://files.pythonhosted.org/packages/72/0d/fde2cf0ae7e1d12d105683d0259c17c151de4efd5d166c0ec1335541e7ba/django_extensions-2.2.1-py2.py3-none-any.whl (222kB) |████████████████████████████████| 225kB 782kB/s Requirement already satisfied: six>=1.2 in /home/admin/.pyenv/versions/anaconda3-2019.03/envs/py37/lib/python3.7/site-packages (from django-extensions) (1.12.0) Installing collected packages: django-extensions Successfully installed django-extensions-2.2.1
python コマンドでインストールバージョンを確認します。ここでは 2.2.1 がインストールされました。
(py37) [admin@centos7 backend]$ python Python 3.7.3 (default, Mar 27 2019, 22:11:17) [GCC 7.3.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import django_extensions >>> django_extensions.VERSION (2, 2, 1) >>>
Django に設定
<project名>/settings.py に下記の設定を追加します。
…
‘django_extensions’,
)
これで、runserver_plus コマンドが使えます。
RunServerPlus をセットアップ
RunServerPlus は Werkzeug デバッガー が組み込まれた runserver ですので、Werkzeug パッケージをインストールします。
Werkzeug をインストール
(py37) [admin@centos7 backend]$ pip install Werkzeug Collecting Werkzeug Downloading https://files.pythonhosted.org/packages/d1/ab/d3bed6b92042622d24decc7aadc8877badf18aeca1571045840ad4956d3f/Werkzeug-0.15.5-py2.py3-none-any.whl (328kB) |████████████████████████████████| 337kB 739kB/s Installing collected packages: Werkzeug Successfully installed Werkzeug-0.15.5
※ 必要に応じて pyOpenSSL パッケージもインストールします。( pip install pyOpenSSL )
SSL 証明書を作成
Let’s Encrypt の無料 SSL 証明書を取得・設定する方は ▼ の記事をご覧ください。
( 以下、この記事の設定をもとに説明します )
SSL 証明書を設定
SSL 証明書のファイル名だけ指定すると自動的にキーファイルが生成されてしまいます。
そのキーファイルは使えませんので、Let’s Encrypt の キーファイルも指定 して起動する必要があります。よって、両方をコピーしておきます。
# certficate ファイルとキーファイルをコピーし、所有権限を python コマンドを実行するユーザ ( ここでは例として、admin ) に修正しておきます # ( ファイル名・ PATH は任意 ) (py37) [admin@centos7 backend]$ sudo cp /etc/letsencrypt/live/example.com/cert.pem ./example-cert.pem (py37) [admin@centos7 backend]$ sudo cp /etc/letsencrypt/live/example.com/privkey.pem ./example-privkey.pem (py37) [admin@centos7 backend]$ sudo chown admin.admin *.pem
runserver_plus を起動
cert-file と key-file を指定して Django 開発サーバを起動します。( ▼ )
https://0:8000/ で起動していれば OK です。
Running on https://0:8000/ (Press CTRL+C to quit)
Restarting with stat
Performing system checks…
System check identified no issues (0 silenced).
Django version 2.2.2, using settings ‘snowball.settings’
Development server is running at https://0:8000/
Using the Werkzeug debugger (http://werkzeug.pocoo.org/)
Quit the server with CONTROL-C.
Debugger is active!
Debugger PIN: 937-024-274
追加オプションを設定 ( 任意 )
Django 開発サーバを HTTPS の下で運用する場合、いくつかのオプションが勧められていますが、必要に応じて設定してください。
SECURE_PROXY_SSL_HEADER を設定して、CSRF の脆弱性の発生を防止します。SECURE_SSL_REDIRECT を True に設定すると、HTTP からのリクエストが HTTPS にリダイレクトされます。
また、安全な Cookie を使用するため、SESSION_COOKIE_SECURE と CSRF_COOKIE_SECURE を True に設定します。
HSTS ( HTTP Strict Transport Security ) は、特定のサイトへのすべての接続に HTTPS を使用することをブラウザに通知する HTTP ヘッダーです。 HSTS ヘッダーを設定することで、HTTP からのアクセスを拒否できますが、この HSTS オプションは SECURE_SSL_REDIRECT や WEB サーバの 301 Redirect 設定と重複する気がするので当分はスキップしておきます。
以上、有効化するには、
▼ のように <project名>/settings.py ファイルの最後など適当なところに追加してください。
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https’) SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True
設定を終えたら、runserver_plus を起動して動作確認を行いましょう!
さいごに
Django 開発サーバではなく、本番用の API サーバ を構築するなら、▼ の記事をどうぞ!
参考文献
django-extensions : Installation instructions
RunServerPlus
Security in Django: SSL/HTTPS
HTTP Strict Transport Security
コメント