KUSANAGI(WordPress)のSSL証明書(Let’s Encrypt)が自動更新されていませんでした。更新するまでの手順を紹介します。
スポンサーリンク
目次
証明書の更新期限が迫っている!
Let’s Encryptから珍しくメールが来ていた。なんだろう?
Hello,
Your certificate (or certificates) for the names listed below will expire in
9 days (on 08 Jul 17 06:24 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.……
は?!
証明書の有効期限が切れそうだという話でした。このブログサーバーの証明書だ…!
しかもよく見たら何通かメール来てたし!!見逃してた…!
若干焦りながらChromeで証明書を確認してみる。
Chromeで証明書を確認する方法は、右クリックして「検証」→「Security」→「View certificate」で確認できます。
うわまじか。
ということで、急いで更新しないといけない状態になりました。
kusanagiコマンドで更新を試みる
ググったところ、kusanagiコマンドで更新できるみたい。なんだコマンド一発じゃないか。
1 | # kusanagi update cert |
…まぁ失敗するよね。これが出来たら自動更新できているはずだし。
原因調査から始めます。
原因はFQDNネーム
エラーメッセージあたりを読んでググると、原因はさくっと分かりました。
以下の2つの条件を満たすとき、kusanagi provision で www.example.com と example.com のどちらかを FQDN に指定すると、www.example.com と example.com の両方を VirtualHost として設定します。
- www.example.com と example.com の両方が、DNS のAレコードに登録されている
- exmaple.com が whois情報に登録されている
また上記の FQDN の指定に加え、メールアドレスを指定して Let’s EncryptでSSL証明書を取得したとき、www.example.com と example.com の両方を登録したSSL証明書を取得します。
kusanagi setting –fqdn でFQDN を変更したとき、kusanagi ssl でLet’s EncryptでSSL証明書を取得するときも、同様の処理を行います。
KUSANAGI バージョンアップ情報 8.0.0-2から引用
要するに、ドメイン名のwww有りとwww無しの2つ同時にSSL証明書を取得する仕様っぽい。
www付きではサイトが見つからずに404となるため、登録に失敗する…という感じでしょうか。
だったら、www付きでアクセスしても404にならなければ良い。そんな対策をしてみます。
nginxの設定を変更
Webサーバの設定を変更し、www付きでアクセスした時にwww無しのアドレスにリダイレクトすれば良い。
/etc/nginx/conf.d/◯◯_ssl.confの中身に以下の内容を追加する。
1 2 3 4 5 6 7 8 9 | server { listen 443 ssl http2; server_name www.hogehoge.com; ssl_certificate /etc/letsencrypt/live/hogehoge/hogehoge.pem; ssl_certificate_key /etc/letsencrypt/live/hogehoge/hogehoge.pem; return 301 https://hogehoge.com$request_uri; } # アドレスやhogehoge部は環境に合わせて修正して下さい。 |
通常HTTPアクセス用の80番ポートにもリダイレクトの設定を行います。
/etc/nginx/conf.d/◯◯_http.confの中身に以下の内容を追加する。
1 2 3 4 5 6 | server { listen 80; server_name www.hogehoge.com; return 301 http://hogehoge.com$request_uri; } # アドレスは環境に合わせて修正して下さい。 |
設定後にnginxを再起動する。
1 | # service nginx restart |
ブラウザでアクセスできるか確認し、wwwつきでアクセスしてもリダイレクトされるため、404にはならないはず!
少し話は変わりますが、Search Consoleを使っている方は下記に注意です。
www付きでも同じサイトにアクセスできるようにした場合は、Search Consoleの設定を行う必要があるので注意して下さい。
詳しくはSearch Console公式ヘルプを参照下さい。(使用するドメインの設定(wwwの有無))
いざ証明書の更新…しかしエラー
再度、証明書更新にチャレンジ!
1 | # kusanagi update cert |
Attempting to renew cert from /etc/letsencrypt/renewal/hogehoge.conf produced an unexpected error: urn:acme:error:rateLimited :: There were too many requests of a given type :: Error creating new authz :: Too many invalid authorizations recently.. Skipping.
どうやら何度も試し過ぎたようです。このエラーが出た場合は1時間程度待ちましょう。
時間を少し置いてチャレンジ。少し違うけどやっぱりエラー。
The client lacks sufficient authorization
……
<head><title>404 Not Found</title></head>
……
再び404。
アドレスは合っていることは確認済みなので、Let’s Encryptで見ている設定が怪しい。
/etc/letsencrypt/renewal/hogehoge.confをチェックする。
確認したところ、[[webroot_map]]のアドレスが正しいWordPressのドキュメントルートに設定されていない!
いつ変わったんだろうか…色々試している中で勝手に書き換えるコマンドがあったのだろうか…
何がともあれ、ただいまドキュメントルートに修正して再度kusanagi update certを実行。
The following certs were successfully renewed:
/etc/letsencrypt/live/hogehoge/hogehoge.pem (success)
成功したようです!
やはり原因は、指定された場所が404になっていて見つからないと証明書更新ができないようです。
テスト
外部から確認する場合はこちらのサイトで確認できます。(QUALY’S SSL LABS)
結果はこちら。
証明書の有効期限が更新されています!無事に証明証が更新されました!
SSL証明書を自動更新するようにスケジューラに登録する
今回は手動で証明書を更新したため、再び有効期限がやってきます。
kusanagiコマンドで定期的に証明書を更新すれば、更新作業は自動化できます。
早速、cronに以下を登録しましょう。
1 2 | # Let's Encrypt update 12 3 * * 4 /usr/bin/kusanagi update cert |
今回は、毎週木曜日の午前3時12分に自動更新させています。時間は環境に応じて変更して下さい。
まぁ、自動更新に失敗し続けたらまたメール来ると思います(笑)
最後に
他のサイトでは、SSL証明書を取得するためのシェルスクリプトを直接修正する方法が紹介されていました。
無理矢理登録させるのはスマートじゃないし、その場しのぎ感があって個人的にはあまり好きじゃないです。
サーバを運用しているとシステム的なトラブルもあると思います。
色んな経験をしながらスキルアップしている感じがして、面倒ですが面白いですね。