LetsEncryptを使って、常時SSL化をする

NO IMAGE

Ubuntu18.04で、Let’s Encryptを設定してHTTPSで接続するようにしましょう。

$ cd (djangoのprojectディレクトリ)
$ sudo apt install certbot

settings.pyとurls.pyにそれぞれ以下を追記します。

settings.py

# 以下追記
CERT_ROOT = os.path.join(BASE_DIR, '.well-known')
CERT_URL = '/.well-known/'

urls.py

urlpatterns += static(settings.CERT_URL, document_root=settings.CERT_ROOT)

それに伴って、nginxの設定にも追記します。(mysite_nginx.conf) staticとかmediaとかと同じディレクトリです。

location /.well-known {
    alias /home/to/django/project/.well-known;
}

以上の設定が終わったあとに、以下のコマンドを打つことで、証明書が発行されます。

$ sudo service uwsgi restart
$ sudo service nginx restart
$ sudo certbot certonly --webroot -w (projectディレクトリまでのpath) -d (ドメイン名)

これで、証明書が発行されたので、nginxの設定をssl化するように変えましょう。

$ vi mysite_nginx.conf

upstream django {
    server unix:///path/to/mysite.sock;
    # server 127.0.0.1:8001;
}

server {
    listen 80;
    listen [::]:80;
    server_name (ドメイン名);
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name (ドメイン名);
    charset     utf-8;
    ssl_protocols TLSv1.2;
    ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;

    ssl_certificate     /etc/letsencrypt/live/(ドメイン名)/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/(ドメイン名)/privkey.pem;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /path/to/media;
    }

    location /static {
        alias /path/to/static;
    }

location /.well-known {
        alias /path/to/.well-known;
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        proxy_pass http://127.0.0.1:8000;
        uwsgi_pass  django;
        include     /path/to/uwsgi_params;
    }
}

$ sudo service nginx restart

すると、常時https化が行われると思います。

Let’s Encryptは、3ヶ月更新なので、cronに登録しておくと良いでしょう。

$ sudo crontab -e

0 3 10 * * /usr/bin/certbot renew && /sbin/service nginx reload

以上になります。