certbotをwebroot方式

Tomcat直SSL運用をやめてApache+Tomcat構成へ|certbotをwebroot方式に変更した話

Tomcat直SSL運用をやめてApache+Tomcat構成へ|certbotをwebroot方式に変更した話

2025-12-17 プログラム・IT

 先日はブログでTomcat運用時の自動更新についてふれました。

しかし、多くのアクセスに耐えられるようTomcat単体の運用から静的なものに関してはApacheで運用する『Apache+Tomcat』の方針に変更しました。

この変更に伴ってサーバ構成が変わったので既存のバッチでは暗号化通信の更新がうまくいかなくなったのでその修正を今回はしていきます。

今回は「Tomcat直SSL運用でハマった過去の設定を完全に捨て、ApacheでSSLを終端し、certbotをwebroot方式に統一する」ということをやっていきます。

構成の変更要素

      80/443:Tomcat → Apache
      SSL終端:Tomcat → Apache
      Tomcat:80/443 → 8080(内部のみ)

つまり、Apache がフロントに立つ構成へ変更しました。

そもそもなんで変更する必要があるのか?

以前はTomcatが80/443を直接Listenしていました。

しかし現在はSSLの終端をApacheに集約しているため、証明書を実際に使用しているのは Apache のみで、TomcatはHTTP(8080)の内部通信しか行っていません。

で、以前のバッチのようにTomcatを止めたところで意味がなくなったわけです。

以前のcertbot standaloneを使って更新する場合、80/443が完全に空いていて、certbotが一時的にWebサーバになる必要があります。

つまり、Tomcat直運用では問題ありませんが、Apacheが80/443を使用している構成では、Apacheを停止しない限り standaloneは使えません。そのため、本構成では standaloneは現実的ではありません。

では、どうするか?

更新方法をcertbot standalone(Tomcat停止必要)からcertbot webroot(Apache稼働中でもOK)に変更したいと思います。

ポイントは

  • Apache がフロントに立つため、Tomcat は止める必要なし
  • webroot モードで certbot が検証用ファイルを置くだけで更新可能(.well-known/acme-challenge/ に置いた検証ファイルを Apache が返すだけ)

バッチの削除

バッチ追加やコード修正の前にブログで組んだバッチを削除します。

コピーしました!
sudo systemctl stop certbot-tomcat.timer    #停止
sudo systemctl stop certbot-tomcat.service #停止
sudo systemctl disable certbot-tomcat.timer #自動起動解除

変更箇所

暗号化通信で振り分けを行ってるApache設定に以下のコードを追加します。

/***/000-default-le-ssl.conf
コピーしました!
# Let's Encrypt 用(certbot webroot)
Alias /.well-known/acme-challenge/ /***/.well-known/acme-challenge/
<Directory /***/.well-known/acme-challenge/>
Require all granted
</Directory>

certbotのwebrootモードが正しく動くためにURLとフォルダの対応とアクセス権を付与しました。この検証ファイルに Let’s Encrypt がアクセスできるようにするための設定です。

/***/.well-known/acme-challenge/ は最初は空で大丈夫です。certbot が更新時に自動で検証ファイルを置き、検証後に削除します。

念のため、実際にurlが返るかどうかを確認するために、/***/.well-known/acme-challenge/hello.txtを作ってみて、アクセスして返ることを確認してみましょう。

そしたら、以下のコードでApache設定チェック(念のため)

コピーしました!
sudo apachectl configtest

「Syntax OK」が出たら、Apache をリロード

コピーしました!
sudo systemctl reload apache2

1回手動で暗号化通信の更新をしてみます。

コピーしました!
sudo certbot renew --webroot -w /***

出力の意味

  • Certificate not yet due for renewal → 正常(期限前だから何もしない)
  • Congratulations, all renewals succeeded. → 更新成功

自動更新の確認

certbot は通常 systemd タイマー certbot.timer により 12 時間ごとに自動更新されます。

コピーしました!
systemctl list-timers | grep certbot

見えていなければ以下のコードで有効化します。

コピーしました!
sudo systemctl enable --now certbot.timer

最後に

混乱される方もいると思いますが、先ほど作った「/***/.well-known/」は隠しディレクトリです。先頭に「.」があるのでそうなります。

WinSCPではデフォルトでは隠しファイルは非表示になっているので、実際ファイルは存在しますが見ることができません。(私も若干混乱しました)

「オプション」→「環境設定」→「パネル」→「隠しファイルを表示」にチェックして見えるようになります。

昔、Tomcatだけで運用していて、頻繁に落ちる事象が発生していて、その根本的対策をずっと考えて、今回それを実行できてよかったです。

みっつーみっつー

静的ファイル処理や接続管理を肩代わりしてくれる