Let's EncryptのルートCA期限切れ問題を直してもらえない人が WordPressを改造して切り抜ける方法
自分がroot権限を持ってるサーバーじゃないのに何とかしなきゃいけない理不尽
先日、[Let's EncryptのルートCA期限切れで OpenSSL 1.0.2が思わぬ事故を起こす件](../openssl-102-letsencrypt-crisis.html)という記事で期限切れしたルートCAにまつわる問題の解説をしたのだが、問題はこれでは終わらない。
某老舗格安共有レンタルサーバ「10/1に Let's Encryptの問題が発生しましたが直しました」
我社「これ、直ってねーじゃねーーーーーーか!」
顧客「は、早く直しーーーーーーーーーーーて!」
ホストのroot権限を持っていない以上、直したくても直せない。レンサバ屋おまえ週末を楽しんでる場合じゃねえぞコラ(大激怒)!**古いバージョンのPHP収容してる環境もちゃんとチェックしたんか?**[^1]っていうか○○○社、うちの記事読んでたの知ってるぞ。
## 非WordPressの場合(ググればわかる情報)
単純で素朴なPHPスクリプトが問題で、[file_get_contents()](https://www.php.net/manual/ja/function.file-get-contents.php) を使ってるだけなら下記のようにオプションを渡すようにすればとりあえず回避できる。
```php
$url = "https://www.walbrix.co.jp";
$options['ssl']['verify_peer']=false;
$options['ssl']['verify_peer_name']=false;
$response = file_get_contents($url, false, stream_context_create($options));
```
それか [curl](https://www.php.net/manual/ja/ref.curl.php)を使っているなら
```php
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
```
を[curl_exec](https://www.php.net/manual/ja/function.curl-exec.php)の前に挟んでやる($curlのとこだけ適宜合わせること)。
## WordPressの場合(この記事を見つけた幸運なあなたのための独自情報)
しかし [WordPress](https://ja.wikipedia.org/wiki/WordPress)を使っていて WordPressの [fetch_feed()](https://developer.wordpress.org/reference/functions/fetch_feed/) 関数などで外のフィードを読みにいったりしている場合は WordPressを改造しないといけない。
仔細を端折って答えだけ言うと、```wp-includes/Requests/Transport/cURL.php``` で
```php
if (isset($options['verify'])) {
if ($options['verify'] === false) {
curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0);
}
elseif (is_string($options['verify'])) {
curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']);
}
}
```
[となっているところ](https://github.com/WordPress/WordPress/blob/master/wp-includes/Requests/Transport/cURL.php#L150)の **前に**
```php
$options['verify'] = false;
```
を挿入すれば、常に外のURLにアクセスする際に SSL証明書の検証をしなくなるのでエラーを回避することができる。もちろんこれは緊急避難のための方法であって恒久的な解決策ではないので、ホストのroot権限を持っているところ(レンサバ屋なりなんなり)が根本的な問題に対処してくれなければならない。WordPressをアップグレードしたら元に戻っちゃうし。
とりあえずお客様にはご安心いただきました。
レンサバ屋はおれの土曜日を返せ。
## 追記
有益情報いただきました
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この記事めっちゃ助かりました。ありがとうございます。<br>ちなみに元ソースをいじりたくなければ、テーマファイルのfunctions.php に <br>add_filter('https_ssl_verify', '__return_false');<br>書いておけば同じことができるように思います〜。</p>— Taichi Maruyama (@mthaichi) <a href="https://twitter.com/mthaichi/status/1445228827148357632?ref_src=twsrc%5Etfw">October 5, 2021</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
## 宣伝
「こういうトラブルシューティングを頼める人がいたらなあ」と思いませんか?トラブルシューティングは要求される知識や経験が幅広い上にあらかじめこれといって定まっているわけではないので、昨今のITエンジニア不足の中そういう人を定常的に雇用するのはコスト的にも機会的にも難しいと思います。
当社は代表が安月給で働いていますので、かなりカジュアルにご負担いただける費用で「たまに必要になった時に助けてくれる人」として皆様と Slackやチャットワークでつながっておくことができます。
ご興味のある事業者様は[お問い合わせフォーム](/inquiry.html)からお気軽にお声がけください。まずはお知り合いになってみたいというだけでも結構です。
Linuxを中心に使用しており、知見を共有するため [Linuxベースの OSを開発・公開しています](https://www.walbrix.net)。こちらもご覧ください。
[^1]: 古いバージョンのPHPを使ってることも問題だけど、それは顧客都合というやつでして・・・。それに古い方は対処できないってならできないって言ってくれてもいいと思うの。こっちは直してくれるもんだと思ってるんで。