背景
二番目のDjango project作成中です。今回は, Django REST frameworkを使って、バックアンド、フロントエンドの完全分離実装, sslによるhttps通信を可能にするなど新しいことに挑戦しながら、進めています。
今回は、ネット上に様々な方からすでに情報共有されていましたが、
1. Django projectへの設定方法はない
2. 最近は結構設定しやすくなっているらしいが、それに関する文章はない
という理由から、Let's Encryptという無料証明書を使ったHTTPSサーバー設定についてポスティングします。
条件
まず、今回の設定においては、以下のような条件を満たす必要があります。
1. ProviderからDomainが取得済みである (例: AWS Route53, ムームードメインなど)
2. Apache2でサイトの設定ファイルが設定済みである
具体的なやり方
Step 1. Lets encryptのインストール
こちらについて、Lets encryptのoffical pageでは Certbotというソフトを使うのを推薦していましたが、調べて見たら特にそれにしなくても簡単にできるようです。
$ cd /usr/local
$ sudo git clone https://github.com/letsencrypt/letsencrypt
Step 2. SSL証明書を作成する前に
参考文章では、上でインストールした後、すぐに作成コマンドで作っていましたが、うまく行きませんでした。実はその前に以下のような設定が必要なんです。
Step 2.1 DNSサーバーでwww付きドメインの設定
providerから買ったドメインではwwwが付いていないと思いますが、DNSサーバーにてwww付け、Aレコードとして追加する必要があります。Lets Encryptの証明書作成フェーズでwwwがないドメインだとエラーになります。
Domain: example.com
追加部分
Name: www.example.com
Type: A record
Value: サーバーのipアドレス
もちろん、apacheのサイト設定ファイルに以下の項目追加を忘れずに。
ServerAlias www.example.com
Step 2.2 mod_wsgi設定行のコメントアウト
この部分は、Django projectに限ります。Django projectをapache2にdeployする時に mod_wsgiというソフトが必要になります。具合的に、mod_wsgiをインストールした後、設定ファイルに以下のような項目を追加することになります。
WSGIDaemonProcess django_wsgi pythonpath=/var/www/myproject:/usr/local/lib/python2.7/dist-packages
WSGIProcessGroup django_wsgi
WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py
Lets Encryptは、既存の設定ファイルを参照して証明書を作った後、自動的にssl対応のサイト説定ファイルを作ってくれますが、 上の部分をコメントアウトしないと以下のようなエラーになります。
Name duplicates previous WSGI daemon definition
従って、まず上の部分をコメントアウトし、証明書が作成され、設定された後、ssl対応のサイト説定ファイルの中でコメントアウトをなくすことで対応できます。
Step 3. Let's Encryptによる証明書の作成
いよいよ作成フェーズになりますが、以下のコマンドを実行するだけで簡単に作成できます。しかも、apacheでの設定ファイルも自動で作ってくれます。
cd letsencrypt/
sudo ./letsencrypt-auto --apache -d example.com -d www.example.com
Step 4. mod_wsgiの設定行を有効にするのを忘れずに
Django projectの場合、作成されたapache設定ファイルの中で、mod_wsgi設定行を有効にする必要があります。
最後に
これで、無料ssl証明書を使ったhttps通信が可能になりました。 最後に注意点として、証明書の有効期限です。上のやり方だと、3ヶ月有効なので、期限が切れる前に、renewalする必要があります。こちらに関しては、他の方が共有した情報がたくさんありますので、そちらを参照にすると良いと思います。
作成済みの時、有効期限に関する記述
Your cert will expire on 2017-12-04. To obtain a new or tweaked
version of this certificate in the future, simply run
letsencrypt-auto again with the "certonly" option. To
non-interactively renew *all* of your certificates, run
"letsencrypt-auto renew"
参考文章
Setting up SSL on a Django App with Let's Encrypt - Ubuntu, Apache, and mod_wsgi