Let's EncryptでHTTPS化した話


GCEとNginxでブログを立ち上げたあと、しばらくHTTPのままで運用していました。ブラウザのアドレスバーに「保護されていない通信」と出るのが気になってきたので、Let’s Encryptを使ってHTTPS化しました。

概要

Let’s Encrypt は無料でSSL/TLS証明書を発行してくれる認証局です。certbot というツールを使うと、証明書の取得からNginxの設定変更まで自動でやってくれます。

今回の構成は以下のとおりです。

項目内容
サーバーGCE(Google Compute Engine)
OSDebian 12
WebサーバーNginx
ドメインyour-domain.com
証明書Let’s Encrypt

やりかた

certbotをインストールする

snapd経由でインストールするのが現在の推奨です。

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

証明書を取得してNginxを自動設定する

以下のコマンドを実行します。--nginx オプションをつけると、証明書の取得と同時にNginxの設定も書き換えてくれます。

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

実行するとメールアドレスの入力と利用規約への同意を求められます。入力後しばらく待つと証明書が取得され、Nginxの設定が自動で更新されます。

ファイアウォールの設定

GCEのファイアウォールでHTTPS(443番ポート)を許可していない場合は、コンソールまたはTerraformで開放しておきます。Terraformの場合は以下のようになります。

resource "google_compute_firewall" "allow_https" {
  name    = "allow-https"
  network = "default"

  allow {
    protocol = "tcp"
    ports    = ["443"]
  }

  source_ranges = ["0.0.0.0/0"]
}

自動更新の確認

Let’s Encryptの証明書は90日で期限が切れます。certbotはsystemdのタイマーで自動更新するよう設定されているので、動いているか確認しておきます。

sudo systemctl status snap.certbot.renew.timer

active になっていれば問題ありません。念のず手動で更新テストもしておくとよいです。

sudo certbot renew --dry-run

Congratulations, all simulated renewals succeeded と表示されれば正常に動作しています。

まとめ

certbotを使うことで、コマンド数回でHTTPS化が完了しました。Nginxの設定を手動で書き換える必要がなく、思ったよりずっと簡単でした。

証明書の自動更新も仕組みとして組み込まれているので、一度設定してしまえばあとは放置できるのもありがたいです。HTTP→HTTPSのリダイレクトもcertbotが自動で追記してくれるので、古いURLでアクセスしても問題ありません。