Let's EncryptでHTTPS化した話
GCEとNginxでブログを立ち上げたあと、しばらくHTTPのままで運用していました。ブラウザのアドレスバーに「保護されていない通信」と出るのが気になってきたので、Let’s Encryptを使ってHTTPS化しました。
概要
Let’s Encrypt は無料でSSL/TLS証明書を発行してくれる認証局です。certbot というツールを使うと、証明書の取得からNginxの設定変更まで自動でやってくれます。
今回の構成は以下のとおりです。
| 項目 | 内容 |
|---|---|
| サーバー | GCE(Google Compute Engine) |
| OS | Debian 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でアクセスしても問題ありません。