WebサイトのHTTPS化は、SEO・セキュリティの両面で必須です。以前に本ブログ内で、「無料のSSLサーバ証明書(Let’s Encrypt)を用いてホームページを常時SSL化する」で紹介しておりましたが、本記事では、nginxに設定する手順を解説します。
前提条件
- nginxがインストール済み
- ドメイン取得済み(DNS設定済み)
- サーバにrootまたはsudo権限あり
手順① Certbotのインストール
Let’s Encryptの証明書取得には「Certbot」を使用します。
# dnf install certbot python3-certbot-nginx
手順② nginxの設定確認
nginxのコンフィグに、以下のようにドメイン設定を実施します。
server {
listen 80;
server_name dassyi.com;
root /usr/share/nginx/html;
location /.well-known/acme-challenge {
root /var/www/html;
}
}
ここでは、Let’s Encrypt用のアクセス可能な領域(/.well-known/acme-challenge)を個別に定義しています。例えば、Basic認証があったり、このサーバにトップのURLからアプリケーションが動くような環境でも、上記のように設定しておけば、証明書の更新が可能になります。
設定後は以下のコマンドで反映します。
# nginx -t
# systemctl reload nginx
手順③ SSL証明書の取得(自動設定)
以下コマンドを実行して、証明書取得+nginx設定が自動で完了します。
# certbot certonly --webroot -w /var/www/html -d dassyi.com
途中で以下を聞かれます:
- メールアドレス入力
- 利用規約同意
私の場合は、あえて、「–nginx」オプションを使用せず、「–webroot」オプションで対応しています。理由は、nginxオプションを使用すると、nginxのコンフィグを勝手に書き加えられるためです。
手順④ 設定反映と動作確認
/etc/letsencrypt/live/dassyi.com/ 配下に、証明書が発行されているので、nginxのコンフィグに証明書のパスと、キーのパスを設定したのち、サービスを再読み込みします。
動作確認は、ブラウザで以下にアクセス:
https://dassyi.com
🔒マークが表示されれば成功です。
手順⑤ 自動更新の設定確認
Let’s Encryptの証明書は90日で期限切れになりますが、自動更新が設定されています。
# systemctl list-timers | grep certbot
以下のような表示が出ればOK👇
certbot.timer
もう一つ確認コマンドを実行します。
# certbot renew --dry-run
で問題なければOKです。
今回はここまでです。最後までお読みいただきありがとうございました。
<以下、追記>
80日後に様子を見ていましたら、証明書の更新は完了していましたが、nginxに反映がうまく自動化できていませんでした。おそらく、手順③で、webroot用に導入しているので、nginxの再読み込みまでは自動で設定されないと推測しています。
そこで、/lib/systemd/system/certbot-renew.service ファイルを参照すると、
ExecStart=/usr/bin/certbot renew –noninteractive –max-log-backups 180 –no-random-sleep-on-renew $PRE_HOOK $POST_HOOK $RENEW_HOOK $DEPLOY_HOOK $CERTBOT_ARGS
といった記載があるので、
# cp -p /etc/sysconfig/certbot /etc/sysconfig/certbot.org
とバックアップして、
# vi /etc/sysconfig/certbot
にて、更新後の動作として、DEPLOY_HOOKの部分に、
DEPLOY_HOOK=”–deploy-hook ‘systemctl reload nginx'”
のように記入します。オリジナルファイルとの差分は以下のようになります。
# diff /etc/sysconfig/certbot /etc/sysconfig/certbot.org
40c40
< DEPLOY_HOOK="--deploy-hook 'systemctl reload nginx'"
---
> DEPLOY_HOOK=""
最後に、以下のコマンドで変更内容を反映します。
# systemctl daemon-reload
これにより、次回の更新時に様子見しましたところ、nginxに自動で読み込みができました。