無料SSLを提供するサービスLet’s EncryptをNginxに導入する

※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

Let’s Encryptをサーバへインストール

Let’s Encryptのインストール

# sshでログイン
ssh root@IPアドレス

# ディレクトリ移動
cd /usr/local/src

# Certbot クライアントのインストール
git clone https://github.com/certbot/certbot

# certbotの確認
ls -l
drwxr-xr-x 14 root root 4096  1月  7 17:10 certbot

# ディレクトリ移動
cd certbot

# 証明書取得
./certbot-auto certonly --webroot \
-w {ドキュメントルート} -d {SSL対象ドメイン} \
-m {メールアドレス} \
--agree-tos

# 下記のように出れば成功
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/tsukarooohi.com/fullchain.pem. Your cert
   will expire on 2017-04-07. 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 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

# 証明書の確認
ls -l /etc/letsencrypt/archive/{SSL対象ドメイン}
-rw-r--r-- 1 root root 1801  1月  7 17:22 cert1.pem
-rw-r--r-- 1 root root 1647  1月  7 17:22 chain1.pem
-rw-r--r-- 1 root root 3448  1月  7 17:22 fullchain1.pem
-rw-r--r-- 1 root root 1708  1月  7 17:22 privkey1.pem

SSL対象ドメイン:tsukarooohi.com
ドキュメントルート:/home/kusanagi/kusanagi_for_tsukarooohi/DocumentRoot

先ほど確認した証明書などは /etc/letsencrypt/archive/{SSL対象ドメイン} 以下に保存され /etc/letsencrypt/live/{SSL対象ドメイン} 以下にシンボリックリンクが作成されます。

Let’s Encryptの証明書は有効期限が90日間となっているため都度更新しないといけません。

この後自動更新の設定をするのですが、Let’s Encrypt自体が自動更新を推奨しているのでこのように簡単なコマンドだけで証明書を更新できるようにしているみたいです。

更新すると先ほどの /etc/letsencrypt/archive/{SSL対象ドメイン} 以下が更新されるわけですが、シンボリックリンクが貼られているためWebサーバー自体の設定の変更は必要なくなるという訳です。

# シンボリックリンクの確認
ls -l /etc/letsencrypt/live/{SSL対象ドメイン}
lrwxrwxrwx 1 root root 41  1月  7 17:22 cert.pem -> ../../archive/{SSL対象ドメイン}/cert1.pem
lrwxrwxrwx 1 root root 42  1月  7 17:22 chain.pem -> ../../archive/{SSL対象ドメイン}/chain1.pem
lrwxrwxrwx 1 root root 46  1月  7 17:22 fullchain.pem -> ../../archive/{SSL対象ドメイン}/fullchain1.pem
lrwxrwxrwx 1 root root 44  1月  7 17:22 privkey.pem -> ../../archive/{SSL対象ドメイン}/privkey1.pem

SSL通信用ポート開放

SSL通信用のポートは443になります。 下記サイトで自分のサーバーが443のポートを開放できているか確認してください。

https://www.cman.jp/network/support/port.html

Webサーバーの設定変更

# ディレクトリ移動
cd /etc/nginx/conf.d

# 現設定ファイルのバックアップ
cp {WPディレクトリ名}_http.conf {WPディレクトリ名}_http.conf.org # http用
cp {WPディレクトリ名}_ssl.conf {WPディレクトリ名}_ssl.conf.org # https用

WPディレクトリ名:kusanagi_for_tsukarooohi

http用設定ファイルの編集

vim {WPディレクトリ名}_http.conf

# httpはhttpsへリダイレクト
server {
  listen 80;
  server_name {SSL対象ドメイン};
  return 301 https://{SSL対象ドメイン}$request_uri;
}

https(SSL)用設定ファイルの編集

vim {WPディレクトリ名}_ssl.conf

server {
    listen       443 ssl http2;
    server_name  {SSL対象ドメイン};

    ssl_certificate      /etc/letsencrypt/live/{SSL対象ドメイン}/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/{SSL対象ドメイン}/privkey.pem;
    ssl_dhparam /etc/kusanagi.d/ssl/dhparam.key;

    ssl_session_tickets     on;
    ssl_session_ticket_key     /etc/kusanagi.d/ssl_sess_ticket.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-G    CM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:E    CDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RS    A-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES    256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

    ssl_prefer_server_ciphers   on;

Nginxの再起動とSSLの確認

# kusanagiサーバーの場合
kusanagi restart

再起動が完了したら実際にブラウザでアクセスしてhttpsになっているか確認しましょう。

今までのhttpのページからhttpsのページに301リダイレクトされるかの確認もお忘れなく!

SSL Server Testで暗号化レベルの確認

SSLの自動更新の設定

Let’s Encryptの無料SSL証明書は有効期限が90日間となっているのですが、毎回手動で更新なんてしてられません。

Certbotクライアントには更新用のコマンドが用意されているため、それを1日/月にクーロンによって自動実行します。

# クーロン設定の確認
crontab -l
no crontab for root

# クーロン設定コマンド
crontab -e

# 毎月1日の1時に強制的に更新をします。
0 1 1 * * root /usr/local/src/certbot/certbot-auto renew –force-renew && systemctl restart nginx

# クーロンの設定確認
crontab -l
0 1 1 * * root /usr/local/src/certbot/certbot-auto renew –force-renew && systemctl restart nginx

これでLet’s Encryptの無料SSL証明書の取得から設定、自動更新までが完了になります。

後は翌月にでもSSLの有効期限を確認し、ちゃんと更新されていれば問題なしです。