Certbotのstandaloneで取得したSSL証明書が更新できない問題

#SSL #Nginx #Apache

CertbotでSSL証明書を取得/更新する時、以下のプラグインから1つを選択する。

  • apache

    • インストール済みのApacheを利用する

  • nginx

    • インストール済みのNginxを利用する

  • webroot

    • 稼働中のWebサーバーのディレクトリを指定する

  • standalone

    • Webサーバーを利用しない

    • 80番ポートを使用する

  • DNS plugins

    • DNSレコードを利用する

    • ワイルドカード証明書を設定できる

  • manual

    • 説明に従って手動で行う

    • 自動更新はサポートしない

Webサーバーの準備ができていない場合、しばしばstandaloneを選択することがあるが、後からNginxやApacheを起動してしまうと80番ポートが使えず更新に失敗する。

この問題は以下の方法で解決することができる。

1. プラグインをapache, nginxまたはwebrootに変更する

"/etc/letsencrypt/renewal/*.conf"を以下のように編集して、プラグインを適切なものに変更することができる。

# nginxの場合

[renewalparams]
account = *****
authenticator = nginx
installer = nginx
server = https://acme-v02.api.letsencrypt.org/directory
key_type = ecdsa
# webrootの場合

[renewalparams]
authenticator = webroot
webroot-path = /var/www/example
www.example.com = /var/www/example

2. hooksを利用してWebサーバーを一時停止する

"/etc/letsencrypt/renewal-hooks/(pre|post|deploy)"以下にスクリプトを配置すると、更新時に実行される。

  • pre - 証明書の更新前に実行

  • post - すべての証明書の更新が終わった後に実行

  • deploy - それぞれの証明書の更新が終わる度に実行

WebサーバーがNginxの場合の例

更新前にNginxを停止する。

# /etc/letsencrypt/renewal-hooks/pre/stop_nginx.sh

#!/bin/bash
systemctl stop nginx

更新後にNginxを起動する。

# /etc/letsencrypt/renewal-hooks/post/start_nginx.sh

#!/bin/bash
systemctl start nginx

※ nginxプラグインの時にこれを行うとNginxのプロセスが重複してsystemctlがエラーになるので注意

スクリプトは"--(pre|post|deploy)-hook"オプションで指定することもできる。

3. 仮想のwebrootを作る

https://zenn.dev/noraworld/articles/auto-renew-letsencrypt-for-nginx-reverse-proxies

参考

作成: 2024/01/09 05:00

更新: 2024/01/30 03:03

thumbnail

tuanemuy

プログラミングとか写真とか。