PR
CentOS 7DjangoPython HTTPSrunserverSSL

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

venice-django-runserver-https CentOS 7

この記事は 2019 年当時の記録です(2026 年 7 月 追記)

runserver_plus で開発サーバを HTTPS 化するという考え方は今も同じです。ただし証明書の用意の仕方が簡単になり、代わりにデバッガの扱いが厳しくなりました。4 点を補足します。

1. 証明書は自動生成できます(Let’s Encrypt のコピーは不要)

本文では Let’s Encrypt の証明書と秘密鍵をプロジェクト配下にコピーしていますが、ファイル名を渡すだけで鍵と証明書が自動生成されます

python manage.py runserver_plus --cert-file cert.crt

開発サーバでの動作確認が目的なら、これで十分です。本文の方法には次の 2 つの問題があります。

  • コピーした証明書は自動更新されません。Let’s Encrypt の証明書が更新されても手元のコピーは古いままなので、いずれ期限切れになります
  • 本番用の秘密鍵をプロジェクト配下に置くことになります。権限を緩めて配置するため、取り扱いに注意が必要です

2. デバッガが表示されないときは、ホスト名の制限です

ここが今回いちばん大きな変更点です。Werkzeug 3.0.3 以降、デバッガは既定でホスト名が localhost.localhost127.0.0.1 のときだけ有効になります。本文のように実際のドメインでアクセスする構成では、デバッガが出てきません。

許可するホスト名を増やすには、settings に次を追加します。

RUNSERVER_PLUS_TRUSTED_HOSTS = ['.localhost', '127.0.0.1']

「設定は合っているのにデバッガが動かない」と悩んだときは、まずここを疑ってください。

3. デバッガを外部に公開しないでください

上の制限が入った理由でもあります。Werkzeug の対話型デバッガは、サーバに対して Python のコードをそのまま実行できます。公式ドキュメントも、本番環境では絶対に使わないよう強く警告しています。

デバッガには PIN による保護が入っていますが、これは攻撃を完全に防ぐためのものではありません。実在するドメインで HTTPS 化して外から見られる状態にするなら、アクセス元を絞るなどの対策を併せてください。--nopin で PIN を無効にするのは、外部から到達できない環境に限ってください。

4. 環境そのものが更新対象です

  • CentOS 7 は 2024 年 6 月 30 日にサポート終了。移行先はこちらの記事の追記にまとめています
  • 本文の Python 3.7、Django 2.2 系はいずれもサポートが終了しています
  • django-extensions と Werkzeug はバージョンの組み合わせで動かなくなったことがあります。過去に Werkzeug 2.1.0 で runserver_plus が起動しない問題が起きました。片方だけ上げるのではなく、両方の対応状況を確認してください

※ 上記は 2026 年 7 月時点の django-extensions・Werkzeug 公式ドキュメントに基づく整理であり、当方の環境での再検証は行っていません。

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をコピーしました