
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