問題巨大な赤い「この接続はプライベートではありません」という警告ほど、ユーザーの信頼を一瞬で損なうものはありません。ブラウザがSSL証明書の期限切れ、またはまだ有効でないことを検知すると、NET::ERR_CERT_DATE_INVALIDエラーが表示されます。Let’s Encryptの証明書の有効期限は90日間です。通常、Certbotは60日目に更新を試みますが、そのプロセスが30日間連続で失敗すると、最終的にサイトはアクセス不能になります。
訪問者がページにアクセスすると、この特定のブラウザフラグによってブロックされます:
NET::ERR_CERT_DATE_INVALID
要約:緊急対応今すぐサイトがダウンしていますか?手動で強制更新を行い、Webサーバーを再起動して新しいファイルを適用してください:
# すべての証明書をすぐに更新する
sudo certbot renew
# 新しい.pemファイルを読み込むためにWebサーバーをリロードする
sudo systemctl reload nginx # Apacheの場合は 'apache2' を使用
certbot renew が「Congratulations」ではなくエラーを返した場合は、根本的な設定に問題があります。
自動更新が失敗する主な理由### 1. 「HTTPS限定」の罠(ポート80が閉じている)CertbotのHTTP-01チャレンジは、最も一般的な検証方法です。これは .well-known/acme-challenge/ に一時ファイルを配置し、ポート80経由でアクセスする必要があります。多くの管理者は、HTTPSには443ポートだけあれば十分だと考えてポート80を閉じますが、Let's Encryptはドメインの所有権を確認するために依然としてポート80を必要とします。
2. RAM内のゴースト(フックの欠如)ディスク上での成功が、必ずしもブラウザでの成功を意味するわけではありません。Certbotは新しい証明書を /etc/letsencrypt/live/ に保存しますが、Nginxは期限切れの古い証明書をメモリにキャッシュし続けます。Nginxにリロードを指示しない限り、プロセスが再起動されるまで期限切れの証明書を提供し続けます。
3. DNSの切断先月新しいVPSに移行しましたか?AレコードやAAAAレコードが古いIPアドレスを指している場合、Let's Encryptの検証サーバーは間違った場所を参照してしまいます。その結果、更新はタイムアウトするか、404エラーを返します。
4. サイレントなCronの失敗ほとんどのLinuxディストリビューションは、1日に2回更新をチェックするためにsystemdタイマーを使用しています。パッケージのアップデートによってこのタイマーがマスクされたり、crontabが破損したりすると、アラートを送信することなく自動化が停止してしまいます。
ステップバイステップのトラブルシューティング### ステップ1:実際の有効期限を確認するブラウザのキャッシュを信用しないでください。サーバーの証明書から直接日付を取得します:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com | openssl x509 -noout -dates
notAfter の行を確認してください。その日付が過去のものである場合、更新は確実に実行されていません。
ステップ2:ファイアウォールの監査ポート80が公開されていることを確認してください。UbuntuでUFWを使用している場合は、ステータスを確認します:
sudo ufw allow 80/tcp
sudo ufw reload
AWSを使用している場合は、セキュリティグループを再確認してください。ソース 0.0.0.0/0 からの HTTP (80) に対するインバウンドルールが必要です。
ステップ3:デバッグ用のドライランを実行する--dry-run フラグは非常に便利です。Let's Encryptの厳しいレート制限に抵触することなく、更新をシミュレーションできます:
sudo certbot renew --dry-run
出力の中で、以下の特定の警告に注意してください:
- "Timeout during connect": ファイアウォールがまだポート80をブロックしている可能性があります。- "404 Not Found": Nginxの
rootディレクティブが、チャレンジ用の間違ったディレクトリを指している可能性があります。- "DNS problem: NXDOMAIN": ドメインが正しく解決されていません。### ステップ4:Nginx設定の整理ポート80のサーバーブロックが、隠しフォルダを誤ってブロックしていないか確認してください。Certbotに適した標準的な設定は以下の通りです:
server {
listen 80;
server_name yourdomain.com;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
# その他すべてをHTTPSにリダイレクト
location / {
return 301 https://$host$request_uri;
}
}
ステップ5:ポストフックで設定を自動化するNET::ERR_CERT_DATE_INVALID エラーが二度と発生しないように、サーバーのリロードを自動化します。更新が実際に成功した場合のみ実行される --deploy-hook を追加できます。これは、タイマーがチェックするたびに実行されるポストフックよりも効率的です。
sudo certbot renew --deploy-hook "systemctl reload nginx"
このコマンドにより、 /etc/letsencrypt/renewal/ にある更新設定ファイルが自動的に更新されます。
修正の確認更新が成功したら、コマンドラインから curl を使用して新しい有効期限を確認します:
curl -vI https://yourdomain.com 2>&1 | grep -i "expire date"
最後に、systemdタイマーが実際に再実行されるようにスケジュールされているか確認します:
systemctl list-timers | grep certbot
「NEXT」列に将来の日付が表示されていれば完了です。これで、手動での操作なしに証明書が常に最新の状態に保たれます。

