Let’s Encrypt + nginx で SSL 化

自分用の覚え書きです。

環境

  • Debian GNU/Linux Jessie
  • さくらVPS
  • ドメイン取得・DNS設定済
  • Let’s Encrypt を利用

準備

手順は大体ここに載っているとおり。ドメインが割り当てられたホストにログインして certbot を使って証明書を発行します。Debian の Jessie の場合、APT リポジトリに backports を追加します。

# echo 'deb http://ftp.debian.org/debian jessie-backports main' \
  >> /etc/apt/sources.list
# apt update

backports から certbot をインストールします。

# apt -t jessie-backports install certbot

次にファイアウォールで外部から80番(HTTP)ポートにアクセスできるようにしておきます。Let’s Encrypt のホストがドメインを確認する時に接続し、certbot が実行されているホスト、申請内容が正しいかチェックするためです。iptables/ufw、各種クラウドサービスのインバウンド設定は割愛します。

証明書の発行

certbot を実行します。 -d オプションでドメインを指定します。複数個を指定して OK です。

# certbot certonly --standalone -d example.com -d www.example.com

画面に表示される手順に従って、項目を入力していきます。メールアドレスは、証明書の失効の通知などが届く連絡先になります。ここでは、HTTPD を止めると書いてありますが、私の環境では無停止でいけました。HTTPD が立ち上がってたらcertbot が80番でListenしなくなった、とかそういう事かな。

端末に

IMPORTANT NOTES:

とメッセージが出て、ドメインや失効日が表示されたら正常終了です。次の場所に証明書が保存されます。

/etc/letsencrypt/live/example.com/*.pem

nginx の設定

設定ファイルの server 項目を下記のように編集します。

# -- snipped --
server {
  listen *:80;
  server_name example.com *.example.com;
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl;
  ssl on;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  # -- snipped --

非SSL(http://~)経由でのアクセスをSSL経由のアクセスをするようリダイレクトしています。また、SSL のプロトコル指定では、脆弱性がある SSLv3 を抜いて無効にしています。 コンフィグテストを行なって問題がないようであれば、リロードします。

# /etc/init.d/nginx configtest
[ ok ] Testing nginx configuration:.
# /etc/init.d/nginx reload

必要に応じて、外部から443番ポートへのアクセスを許可すれば完了です。

証明書の更新

Let’s Encrypt が発行してくれる証明書は90日間で失効します。定期的に更新する必要があります。 手動で行うには certbot コマンドに renew オプションを与えます。このホストに登録されている Let’s Encrypt のすべての証明書の有効期限を調べ、失効日が近いものを更新してくれます。 試しに実行してみると

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
#

となりました。先ほど作ったばかりの証明書なので、ここは「リニューアルする必要なし」です。

手動更新はアレですので、cron に登録しておきます。

# echo 'certbot renew && /etc/init.d/nginx reload' > /etc/cron.weekly/certbot
# /etc/init.d/cron reload

以上です。

参考

コメントを残す

メールアドレスが公開されることはありません。