環境について
- Linux CentOS7
- apache
- PHP(CakePHP2)
- Let's Encrypt
SSL証明書の更新でエラー
某WebサイトでLet's Encryptを使っています。
Let's Encryptは3か月ごとに更新をしなければならなく、証明書の期限が1か月前から更新することができます。
それを毎回手動でやるのは結構面倒なので、cronでバッチ処理をして自動でSSLの更新をかけていることにして、実行した場合はその結果をメールで返す仕組みにしています。
更新失敗のメールが届く
ある時メールに更新失敗の件名が…
Faild renew letsencript SSL cert
現状Webサイトは問題なかったのですが、これが更新期間を過ぎると、
信頼されていないサイトです
的な表示が出てしまうのですぐに対処します。
CentOSの中へ
とりあえず手動で実行してみます。
certbot renew --dry-run
以下の結果が…
Cahllenge failed for domain *****.jp
Challenge failed for domain www.*****.jp
Attempting to renew cert (www.*****.jp) from /etc/letsencrypt/renewal/www.*****.jp produced an unexpected error: Some challenges have failed.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
※一部伏字
こんな感じでとにかく、失敗したよ的なことがずらずらと書かれているわけです。
注目すべきはさらにその下。
Domain: ******.jp
Type: unauthorized
Detail: Invalid response from
https://******.jp/.well-known/acme-challenge/xZtOg19utX8Mch7n3hgYJNeNk4GM2PBw6LVqFgzs9pI
[153.***.***.***]: "<!DOCTYPE html>\n<html lang=\"ja\"
ng-app=\"NetCommonsApp\">\n<head>\n\t<meta
charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" conte"
ここにアクセスしたらうまくいかなかったよ~みたいなことが書かれています。
https://******.jp/.well-known/acme-challenge/xZtOg19utX8Mch7n3hgYJNeNk4GM2PBw6LVqFgzs9pI
↑自分のドメイン+「.well-known/acme-challenge」みたいなURLです。
どうやらここにSSL証明書が配置されているみたいですが、アクセスできないから失敗したとのことです。
正しくそのURLの先を導いてあげる
今回はapache+CakePHP2でWebサイトを構築しています。
ルートディレクトリは以下の感じです。
apache側も以下のパスを参照するように設定されています。
/var/www/html/cakephp
いったんルートディレクトリへ
cd /var/www/html/cakephp
ルートディレクトリなので、ここにアクセスするのが普通なのですが、
CakePHPではさらにここからリダイレクトしているわけですね。
それをやっているファイルが
.htaccess
になります。
中身はこんな感じです。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
CakePHPの中のapp/webrootにさらにリダイレクトしてあげています。
ただ、webrootの中にwell-knownというディレクトリは存在しないので、
「https://*****.jp/well-known」というURLにアクセスがあった場合は、リダイレクトさせないようにします。
以下の文を追加
RewriteRule ^\.well-known(.*)$ .well-known$1 [L]
↓
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^\.well-known(.*)$ .well-known$1 [L]
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
これでwell-knownにアクセスした場合はリダイレクトされなくなります!
再度実行!
以下のコマンドを実行
certbot renew --dry-run
成功時のログを取っておくのを忘れてしまいました。。
failedという文字が出ていないこと、
succeedという文字が出ていること、
を確認できたら大丈夫だと思います。
成功したら「--dry-run」を外して再実行。
certbot renew
無事、証明書が更新されました。
終わり。