環境
Nginx + uwsgi + Djang 1.10 on CentOS 7 (さくらVPS)
letsencryptとは?
無料でウェブサイトを暗号化通信HTTPSにできる.詳細はこちら
どうやるか?
Certbotインストール
letsencryptの認証を自動化してくれる Certbot をインストールする.
ここで環境を選択すると,それぞれのインストール手順を示してくれる
自分の場合は以下の通り(Cent OS 7, Nginx)
sudo yum install certbot
certbotで認証する
以下ようなコマンドを打つ.Djangoだとこのままだと成功しない.
# /var/www/example = Django project root
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
- --webroot でwebrootプラグインなるものを使う
- -w で認証ファイルの置き場を指定する.ここがDjangoの場合問題になる.
- -d で認証させたいドメインを指定する.今回は example.com www.example.com になる.
-w 認証ファイルの置き場について
certbotによって -w で指定した場所に,以下のような認証のためのファイルがつくられる.
# 上の例の場合
/var/www/example/.well-known/acme-challenge
Django(とかRailsとか)の場合
DjangoとかRailsののような静的ファイルをそのまま配信しないようなアプリケーションサーバは,上で指定した /var/www/example/.well-known/acme-challenge に認証のためのファイルを作成されても読み込めないので,エラーになる.
よってこの -w で指定するディレクトリには,Djangoの静的ファイル置き場の場所を指定する必要がある.普通は多分以下の通り,Djangoプロジェクトの直下にあるstaticである.
/var/www/example/static
こうすれば,静的ファイルの場所に認証局が認証ファイルを読みいけるので, certbotによる認証作業はクリアできるが,まだ nginx側 の設定をいじる必要がある.
nginxのconfigをいじる
server {
listen 80;
#
# いろいろな設定
#
location /.well-known {
root /var/www/example/static;
}
}
server {
listen 443 default ssl;
# いろいろな設定
}
これで認証が通る.
certbot certonly --webroot -w /var/www/example/static -d example.com -d www.example.com
認証が通ったら,nginxのlisten 443している方の設定を代えて,認証ファイルを指定してやる.
server {
listen 80;
#
# いろいろな設定
#
}
}
server {
listen 443 default ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# いろいろな設定
}
これで https://example.com にアクセスして通常通りにページが表示されればSSL化できている.
参考
https://certbot.eff.org/#centosrhel7-nginx
https://www.abidibo.net/blog/2016/10/07/securing-django-lets-encrypt/