UTALI

みんなの役に立つ情報をどんどん公開していきます

Nginxで起動中のサーバーにLet's Encryptを導入してSSL証明書を発行する

Nginxで起動中のサーバーにLet’s Encryptを導入してhttps化するためのSSL証明書を発行する

環境:

  • Ubuntu 14.04
  • Node.js 6.7.0

前提条件

  • 独自ドメインを設定済みで正引き設定のAレコードでHTTPリクエストを送ることができる。
  • 外部からサーバーのポート80番と443番にアクセスできる
  • gitとpythonをインストール済み

最初にLet’s Encryptからプロジェクトをインストールします。

git clone https://github.com/letsencrypt/letsencrypt.git

Nginxで起動中のサーバーであれば自動的にSSL証明書を導入する手段があります。まずはCertbotが直接ディレクトリにアクセスできるように設定を行います。

デフォルトの設定ではNginxの設定ファイルは/etc/nginx/sites-available/defaultに配置されているはずです。Vimで編集します。

sudo vi /etc/nginx/sites-available/default

そしてサーバーの設定ファイルに以下を追加

server {
        . . .

        location ~ /.well-known {
                allow all;
        }

        . . .
}

構文が正しいか確認します。

sudo nginx -t

エラーが出なければ以下のコマンドを入力してNginxを再起動します。

sudo service nginx restart

そしてletsencryptのディレクトリに移動

cd /home/letsencrypt

Nginxでは便利なWebrootモードが利用できます。必要なのは–webroot-pathでindex.htmlが配置してあるディレクトリを指定することと、-dでSSL証明書を発行する対象のドメインを指定します。

ここでは、blog.example.comとします。

sudo certbot-auto certonly -a webroot --webroot-path=/usr/share/nginx/html -d blog.example.com

次には連絡先としてEメールアドレスを入力するように促されます。入力して次に

f:id:mochizuki_p:20161121223821p:plain

利用規約に同意しろ。ということなので一応目を通しておいてください。Agreeを選択

f:id:mochizuki_p:20161121223828p:plain

次は重要です。

f:id:mochizuki_p:20161121025400p:plain

https化したいドメイン名をサブドメインの部分を含めて入力してください。/やhttp://は含みません。

成功すると以下のようなメッセージが表示されます。

IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at

   /etc/letsencrypt/live/blog.example.com/fullchain.pem. Your cert will

   expire on 2017-02-19. To obtain a new or tweaked version of this

   certificate in the future, simply run certbot-auto again. To

   non-interactively renew *all* of your certificates, run

   "certbot-auto renew"

 - If you lose your account credentials, you can recover through

   e-mails sent to mochizuki@example.com.

 - Your account credentials have been saved in your Certbot

   configuration directory at /etc/letsencrypt. You should make a

   secure backup of this folder now. This configuration directory will

   also contain certificates and private keys obtained by Certbot so

   making regular backups of this folder is ideal.

 - If you like Certbot, please consider supporting our work by:



   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


Diffie-Hellmanグループの作成

ここで導入されたSSL証明書を単独で利用してもよいのですが、より強力な暗号化を実現するためにDiffie-Hellmanグループを作成します。

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Nginxの設定を変更

デフォルトの設定ではこのようになっている箇所があります。これをコメントアウトしましょう。

        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

そして以下に書き換えます。

  listen 443 ssl;

        server_name 
blog.example.com;

        ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;

続けてSSLの細かい設定を・・

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 2d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

しかし、この設定だとhttpでアクセスされたときに、404 Not Foundのエラーになってしまいます。これを避けるにはリダイレクトを設定します。

server {
    listen 80;
    server_name blog.example.com;
    return 301 https://$host$request_uri;
}

構文が正しいか確認します。

sudo nginx -t

エラーが出なければ以下のコマンドを入力してNginxを再起動します。

sudo service nginx restart

自動更新の設定

Let’s EncryptのSSL証明書の有効期限は90日と短くなっています。また、更新が可能になるのは期限切れの30日前からとなっています。

その期間から、以下のコマンドを入力することで自動的にSSL証明書を更新することが可能です。

certbot-auto renew

手動でもよいのですが、Cronで自動化するといいでしょう。 もし更新が可能になる前に、上記のコマンドを入力しても何も問題は起きないので、毎週1回、更新を試みるようにするといいでしょう。

sudo crontab -e
30 0 * * 7 /home/letsencrypt/certbot-auto renew # certbot-autoのパスは各自確認すること
0 1 * * 7 service nginx reload

これは毎週日曜日の午前0時30分にSSL証明書の自動更新を試み、そして30分後にNginxを再起動するように設定するものです。