Let’s Encrypt 自動更新失敗の復旧録

Let’s Encrypt 自動更新失敗の復旧録

Let’s Encryptを設定できた! と思いきや自動更新が正常に実行されなかったがために3ヶ月後に悪夢を見るはめになったのでここに復旧録を残しておきます。。。
流れとしては①手動で更新した後、②自動更新コマンドを設定、③コマンドの実行を確認 という流れになっています。

【手動更新】

まずは手動で古い証明書を更新します。今回はrootユーザーでのcentos7系が環境になります。(詳しいことは確認し忘れました。。。)
まずは

  • ①証明書の更新
  • ②更新の確認
  • ③webサーバーの再起動
  • ④該当サイトのブラウザ上で確認
    • です。

      ①証明書の更新
      #certbot renew
      
      ②更新の確認
      #openssl x509 -in /etc/letsencrypt/live/<ドメイン>/fullchain.pem -noout -dates
      -------------出力例-------------
      (notBefore=証明書発行日、notAfter=証明書期限)
      
      notBefore=Oct 26 09:56:20 2019 GMT
      notAfter=Jan 24 09:56:20 2020 GMT
      ---------------------------------------
      
      ③webサーバーの再起動
      #systemctl restart httpd
      
      ④該当サイトのブラウザ上で確認
      
      

      【②で更新を確認できているにも関わらず、④で証明書の更新をブラウザで確認できない場合】

      ①必要ファイルの確認
      #ls /etc/letsencrypt/archive/<ドメイン名>/
      
      ②webサーバへの設定(設定ファイル表示)
      #vi /etc/httpd/conf.d/ssl.conf
      
      ③下記該当箇所を①で確認した各ファイル名に変更する
      ...
      SSLCertificateFile /etc/letsencrypt/live/[ドメイン]/cert.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン]/privkey.pem
      SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン]/chain.pem
      ...
      
      ④webサーバーの再起動
      #systemctl restart httpd
      
      

      これで手動での更新処理は終了です。この時点でとりあえずページのアクセスエラーは解消されているはずです。
      では次に次回以降に悪夢を見なくても済むように、証明書の自動更新設定を行っていきます。

      【自動更新設定(cron設定)】

      自動更新はcronでデーモンコマンドを設定します。 オプションの「–post-hook」にはメインのコマンド実行後に実行したいコマンドを指定できます。今回の場合ではwebサーバーの起動を設定しています。
      cronの設定方法についての詳細は省きますが、時間指定の部分は下記に記します。

      ①cron設定画面を開く
      #crontab -e
      
      ②下記を追加
      0 4 * * * certbot renew -m [メールアドレス] --post-hook "systemctl restart httpd"
      
      
      項目 数値
      0-59
      0-23
      1-31
      1-12
      曜日 0-7 (0または7は日曜日)
      0=日、1=月、2=火、3=水、4=木、5=金、6=土、7=日

      実際の復旧事例

      概要

      • 失効していた証明書の復旧
      • サブドメインへの証明書適用(wwwありをメインドメイン、wwwなしをサブドメインとしていたサイト)

      手順

      • ①古い証明書の失効/削除
      • ②証明が削除されているかの確認
      • ③mod_sslのアンインストール/インストール、cerbot用のアパッチプラグインを再インストール
      • ④webサーバーの再起動(apache)
      • ⑤新しい証明書のインストール
      • ⑥各種設定ファイルの変更
      • ⑦webサーバーの再起動(apache)

      手順解説

      ①古い証明書の失効/削除

      ↓ファイル確認
      ls -l /etc/letsencrypt/archive/{ドメイン名}/
      ↓revokeの実行
      certbot revoke --cert-path /etc/letsencrypt/archive/{ドメイン名}/cert1.pem
      失効後に証明書を削除するか聞かれるので、yを入力してreturn
      

      ②証明が削除されているかの確認

      ↓関連ファイルが消えたことを確認(最後のフォルダは表示されません)
      ls -l /etc/letsencrypt/archive/{ドメイン名}
      ls -l /etc/letsencrypt/live/{ドメイン名}
      ls -l /etc/letsencrypt/renewal/{ドメイン名}.conf
      

      ③mod_sslのアンインストール/インストール、cerbot用のアパッチプラグインを再インストール

      ↓mod_sslをremoveしてinstallし直す
      # yum remove mod_ssl
      # yum install mod_ssl
      ↓CertbotのApache用プラグインも一緒にremoveされてしまうので、それも再インストールする
      # yum install certbot-apache

      ④webサーバーの再起動(apache)

      systemctl restart httpd 
      (ここでエラー「Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.」)
      ↓エラーに従ってapacheのステータス確認
      #systemctl status httpd.service

      この時点で下記のエラーが発生
      証明書を削除したことによって設定ファイルで指定されている「秘密鍵」「SSLサーバ証明書」「中間CA証明書」が見当たらない旨のエラーを吐く。
      なのでこれが正しいのかはわからないが、とりあえず先に証明書を取得する(強引)

      httpd[21032]: AH00526: Syntax error on line 8 of /etc/httpd/conf.d/_vhost.conf:
      httpd[21032]: SSLCertificateFile: file '/etc/letsencrypt/archive/<ドメイン>/cert1.pem' does not exist or is empty

      ⑤新しい証明書のインストール

      certbot certonly -d <ドメイン> -d <サブドメイン> --email <メールアドレス>
      
      もともとは下記のコードで取得する気満々だったけど、-webrootがないやらなんやらで通らなかったので色々却下しました
      certbot certonly --apache –webroot -w /home/<ドメイン>/public_html -d <ドメイン> -d <サブドメイン> --email <メールアドレス>
      

      いくつか数字で答える形式で対話が発生するので各自答える(内容はメモれなかったのでごめんなさい)

      ↓こんなメッセージが出力されればOK
      Congratulations! You have successfully enabled https://<ドメイン> and
      https://www.<ドメイン>

      ⑥各種設定ファイルの変更

      と、その前に一度取得した証明書を確認しましょう。
      こちらで設定ファイルだけをまとめたページを作成しているのでそちらでも確認できます。

      pemファイル確認

      と、その前に一度取得した証明書を確認しましょう。

      #ls /etc/certbot/archive/<ドメイン>
      ---------------------------------------------
      cert1.pem privkey1.pem chain1.pem

      ありましたね。各ファイル名をメモっておいてください。

      下記3ファイルに証明書の紐付けをする行があるのでそれぞれ確認する

      (細かいところはメモれなかったのでごめんなさい。参考にしたサイトを下記に載せているのでそちらで補ってくださいませ)

      vi /etc/httpd/conf/httpd.conf
      vi /etc/httpd/conf.d/ssl.conf
      vi /etc/httpd/conf.d/virtual.conf
      
      下記3行を追加する(ファイル名気おつけて)
      SSLCertificateFile /etc/letsencrypt/live/<ドメイン>/cert1.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/<ドメイン>/privkey1.pem
      SSLCertificateChainFile /etc/letsencrypt/live/<ドメイン>/chain1.pem
      
      秘密鍵:SSLCertificateKeyFile
      SSLサーバ証明書:SSLCertificateFile
      中間CA証明書:SSLCertificateChainFile

      ⑦webサーバーの再起動(apache)

      ↓再度webサーバー(apache)の再起動
      systemctl restart httpd

      あとがき

      というわけで、これで僕は解決しました。
      もちろん唯一の手段というわけでは絶対にないので
      他のサイトと比較しながら参考になれば幸いです。

      備考

      上記のスッテプで登場したファイルの場所や変更内容、参考にしたサイトを載せておきます。

      設定ファイル

      vi /etc/httpd/conf/httpd.conf
      vi /etc/httpd/conf.d/ssl.conf
      vi /etc/httpd/conf.d/virtual.conf
      

      証明書及び関連項目

      秘密鍵:SSLCertificateKeyFile
      SSLサーバ証明書:SSLCertificateFile
      中間CA証明書:SSLCertificateChainFile

      証明書設定内容

      SSLCertificateFile /etc/letsencrypt/live/<ドメイン>/cert1.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/<ドメイン>/privkey1.pem
      SSLCertificateChainFile /etc/letsencrypt/live/<ドメイン>/chain1.pem

      参考にしたサイト

Linuxカテゴリの最新記事

%d人のブロガーが「いいね」をつけました。