1. はじめに
以前、AWS Lightsail + WordPress でポートフォリオを構築し、セキュリティ強化までの手順を記事にまとめました。
https://qiita.com/kawakami0429/items/ebabccdfc1fe2aa15693
しかしある日突然、サイトが 「接続がプライベートではありません」 というSSLエラーで閲覧不能に。

自動更新(bncert-tool)が効いておらず、さらにツール自体もバグで実行できないという絶望的な状況から、裏の lego コマンドを直接叩いて力技で手動復旧させたので、そのトラブルシューティングの記録を残します。
2. 障害状況の切り分け(インフラエンジニアの視点)
闇雲に設定をいじる前に、まずは原因の切り分けを行いました。
-
ドメインアクセス: SSLエラー(
接続がプライベートではありません) - IPアドレスアクセス: タイムアウト(ポート80/443が怪しい?)
- AWSコンソール: インスタンスは「実行中」
- SSH接続: 可能(サーバー自体とポート22は生きている)
SSHで内部に入り、Webサーバーの状態を確認します。
ss -tuln | grep -E ':80|:443'
Apacheはしっかりポート80と443で LISTEN していました。これで「サーバー内部は無実(正常)。原因はSSLの期限切れ、およびファイアウォール(ポート80)の閉鎖による自動更新失敗」と断定しました。
3. 発生したトラブル:bncert-tool の異常終了
通常なら sudo /opt/bitnami/bncert-tool を再実行すれば直るはずですが、実行すると以下のエラーを吐いてツール自体が落ちてしまいました。
Error running ./autoupdate-linux-x64.run --mode unattended: child process exited abnormally
ツールの自動アップデート機能が内部でバグを起こしている模様。ツールが使えないため、手動(CUI)でのリカバリに切り替えました。
4. 復旧手順(解決策)
① AWS側でポート80(HTTP)を一時開放
Let's Encryptの認証サーバーは、ドメインの所有権を確認するために外部からポート80を使ってアクセスしてきます。以前のセキュリティ強化でここを閉じていると更新に失敗するため、AWS Lightsailの「ネットワーキング」タブから一時的に HTTP(80ポート / Anywhere) を開放します。
② lego コマンドを直接叩いて強制更新
bncert-tool の裏で動いている Let's Encrypt クライアント lego を直接実行します。
Webroot認証(--http)のオプションを明示的に指定するのがポイントです。
sudo /opt/bitnami/letsencrypt/lego \
--path /opt/bitnami/letsencrypt \
--email="あなたのメールアドレス" \
--domains="あなたのドメイン.com" \
--domains="www.あなたのドメイン.com" \
--http \
--http.webroot="/opt/bitnami/wordpress" \
renew
成功すると、ログに The certificate expires in 89 days(発行直後のため、残り89日あるよという意味)と表示され、無事に最新の証明書が取得できます。
③ Webサーバー(Apache)の再起動
新しくなった証明書ファイルをApacheに読み込ませるため、サービスを再起動します。
sudo /opt/bitnami/ctlscript.sh restart apache
ブラウザのシークレットウィンドウでアクセスし、無事に鍵マークが復活してサイトが表示されるようになりました!
5. まとめと教訓
- 公開して終わりではない: セキュリティのためにポート80を閉じると、Let's Encryptの自動更新(3ヶ月ごと)が失敗する罠がある。
-
ツールが壊れても焦らない:
bncert-toolのようなラッパーツールがバグで動かなくなっても、その裏で動いているコアな仕組み(今回の場合はlego)を理解していれば、手動でいくらでもねじ伏せることができる。
実務さながらの良いインシデント対応の経験になりました。同じ状況で詰まった方の参考になれば幸いです。