今月末でサイトのSSL証明書の期限が来る事になっていて、自分のサイトでは有料SSL(セコム運営のSecured by JPRS)を5年使用して来て、しかし、自サイトのサーバーがあるさくらインターネットが会社で契約している「無料SSLが使える」と言うから、今年からそれに切り替えてみた。さくらでは切り替えの手続きは非常に簡単で、有料SSLを更新するより簡単な位。
しかし、途端サイトにエラーが…。
目次
無料SSL"Let's Encrypt"に切り替えた後、サイトがエラーを吐く
今回切り替えた無料SSLは「Let's Encrypt」と言うもので、非営利団体が出しているSSL。その後援企業を見ると、「早くSSLにしろ」とサイト運営者に圧力を掛け続けたGoogle Chromeの名前もあるし、アマゾン運営のAWSの名前もあるし、大手のIT企業の名前がずらっと並んでいる。大丈夫っぽいと判断しました。
しかし、切り替えた直後は多分ブラウザのキャッシュのせいだったのか何も問題も無いように見えていたけど、今朝起きてサイトを見てみたら、兄弟サイトから取得しているRSS記事の一覧に思い切りエラーが出ているし、以下の一文があった。
WP HTTP Error: cURL error 60: SSL certificate problem: certificate has expired
訳「HTTPエラー: cURL error 60:SSL証明書の問題:証明書の有効期限が切れています」
WordPressで長くサイトを運営してれば、何かをアップデートした時にサイトがエラーを吐く事は珍しい事じゃないし、それに前日にSSLを無料版に変えているから、このエラーには大いに心当たりがあります。SSLに何か問題がある…。
しかし、サイトのSSL証明書は昨日更新したばかりなんだから期限が切れているとかありえないし、実際、確認しても証明書の有効期限は昨日の10月15日からスタートしているし、うーん…。
"Let's Encrypt"の証明書の有効期限切れの問題
それで調べてみると、既に10月に入って、Let's EncryptのSSL証明書の期限切れは日本でも結構問題になってました。
自分のサイトでは兄弟サイト同士でRSSによる記事一覧の取得が出来ない程度の問題で、それによって読者の人に迷惑が掛かるような問題では無いし、いざとなればそのウィジェットを暫くサイトから削除して様子見すればいいや…程度の全然深刻な問題では無いんだけども、正直に5年間世話になった有料SSLに戻る事も頭に過ぎったりもした。無料で提供されているものに激しく文句言うのもお門違いの話しで。
しかし、この手の問題が起きた時、日本の場合、一部のITに詳しい個人サイト以外、大手のIT記事なんて殆ど解決策につながらない事が殆どで、迷いなくWordpressの英語版フォーラムに行く事にしました。
WordPressの英語フォーラムでも"Let's Encrypt"の証明書切れが問題になっていた
そしたら"Let's Encrypt"の件については、証明書切れが予告されていた9月30日直後からやっぱりスレッドが立っていました。
すると、このSSL証明書で起こるWordpressの問題の解決法として、神リンクを置いてくれている人が居たー!! この投稿者の方のサイトのようで、本当にどうもありがとうー!!
英語がわかる人はわかりやすい記事なのでそのまま読んで貰えば問題が解決出来ると思うけど、英語がわからない人の為に少し解説します。
WordPressでの"Let's Encrypt"の証明書切れ問題の解決法
実は、解決方法を書いてくれているサイトの管理人さんは、いずれWordpressのアップデートでこれは解決されるだろうと言っています。それでも、それが待てない人の為の修正方法と言う事で、2つの修正方法を書いてくれてました。
自分のところは既にWPプラグインの「Code Snippets」が導入されている為、2番目の解決方法の方がはるかに簡単そうなので、その方法を選択したけども、Code Snippetsと言うプラグインは、テーマのfunctions.phpに何か追加の処理や制御が必要になった時、WPのファイルに直接書き込まなくても、その追加が簡単に出来るプラグインです。当然のようにテーマのアップデートが来ても、Code Snippetsで追加したコードは影響を受けません(アップデートの度に追記しなくても良い)
それを使用しての方法を説明して行きます。
Code SnippetsのAdd Newから新しいコードを作成します。
そこに管理人さんが書いてくれているコードをコピペします。
/** * Goto http://yoursite.com/?update-wp-ca-bundle */ if( isset( $_GET['update-wp-ca-bundle'] ) ){ $crt_file = ABSPATH . WPINC . '/certificates/ca-bundle.crt'; $new_crt_url = 'http://curl.haxx.se/ca/cacert.pem'; if( is_writable( $crt_file ) ){ $new_str = file_get_contents( $new_crt_url ); if( $new_str && strpos( $new_str, 'Bundle of CA Root Certificates' ) ){ $up = file_put_contents( $crt_file, $new_str ); echo $up ? 'OK: ca-bundle.crt updated' : 'ERROR: can`t put data to ca-bundle.crt'; } else { echo 'ERROR: can\'t download curl.haxx.se/ca/cacert.pem'; } } else { echo 'ERROR: ca-bundle.crt not writable'; } exit; }
そして、一番下のボタン「save changed and activate」(変更をセーブ、有効化)をポチッとして有効にします。
その後、自分のサイトのホームURLに/?update-wp-ca-bundle
を足したページにアクセスします。管理人さんは、http から始まるアドレスを書いてくれているけど、httpsからスタートするアドレスでも大丈夫そうです。
http://○○○.com/?update-wp-ca-bundle ← こんな感じ。
そうすると真っ白なページの片隅に「OK: ca-bundle.crt updated」と出て来るので、これで処理は完了。問題が起きていた箇所を確認すると以前のようにちゃんと訂正されている筈です。
この処理が終わった後は、Code Snippetsに加えたコードは削除してしまってOKとも書いてくれてるし、「次のWordpressのアップデートでこの問題が解決されなかったら、この手順を繰り返して下さい」とも書かれてあるので、Code Snippetsで加えたコードは、「deactivated」(効果Off)で保存して、次のアップデートまで取っておく方がいいのかな? 自分のサイトではそうする事にしました。
以上で自分のサイト2つの問題は解決する事になって、知識を頂いたサイトには重ねて感謝します。