PR

nginxでLet’s Encryptを設定する手順

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に自動で読み込みができました。