CentOS 7DjangoPython HTTPSrunserverSSL

Django 開発サーバ Runserver を SSL/HTTPS 化する〜CentOS 7〜

venice-django-runserver-https CentOS 7
スポンサーリンク

Django Framework の拡張機能のコレクションである Django Extensions を利用します。
このパッケージには管理コマンド、追加のデータベースフィールド、管理拡張機能などが含まれますが、その中で、RunServerPlus を使用して Django 開発サーバを HTTPS 化します。

現状・条件

  • CentOS Linux release 7.6.1810 (Core)
  • Django : 2.2.2
  • Python パッケージdjango-extensions-2.2.1、Werkzeug-0.15.5、pyOpenSSL-19.0.0

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 に下記の設定を追加します。

INSTALLED_APPS = (

‘django_extensions’,
)

これで、runserver_plus コマンドが使えます。

RunServerPlus をセットアップ

RunServerPlusWerkzeug デバッガー が組み込まれた 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-filekey-file を指定して Django 開発サーバを起動します。( ▼ )
https://0:8000/ で起動していれば OK です。

(py37) [admin@centos7 backend]$ python manage.py runserver_plus –cert-file ./example-cert.pem –key-file ./example-privkey.pem 0:8000
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_REDIRECTTrue に設定すると、HTTP からのリクエストが HTTPS にリダイレクトされます。
また、安全な Cookie を使用するため、SESSION_COOKIE_SECURECSRF_COOKIE_SECURETrue に設定します。

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 を起動して動作確認を行いましょう!

https://<ip address> → https://<domain-name>

HTTPS 使用する際には IP アドレスではなく、ドメイン名を使用します。
エラー: GET https://192.168.10.10:8000/surveys/?publish_results=true net::ERR_CERT_COMMON_NAME_INVALID

対処:https://example.com:8000 に変更してアクセスします。

スポンサーリンク

さいごに

Django 開発サーバではなく、本番用の API サーバ を構築するなら、▼ の記事をどうぞ!

参考文献

django-extensions : Installation instructions
RunServerPlus
Security in Django: SSL/HTTPS
HTTP Strict Transport Security

コメント

タイトルとURLをコピーしました