Let’s Encryptのルート CA期限切れでPHP(file_get_contents)でエラー

Let’s Encryptのルート CA期限切れで、SSL通信ができなくなった

10月1日になると、PHPのfile_get_contentsで、SSL通信するとエラーがでて処理ができなくなりました。PHPで指定しているURLをブラウザでアクセスできるし原因はいまいちわかりませんでしたが、SSL通信しているサーバーは、Let’sEncryptの証明書を利用しているのを思い出しました。

少し前に「数百万のHTTPSサイトが利用するLet’s Encryptのルート証明書が期限切れ間近、古いデバイスやOSは要注意」という記事があったのを思い出しました。

もう少し調べると「Let’s EncryptのルートCA期限切れで OpenSSL 1.0.2が思わぬ事故を起こす件」という記事を見つけました。
エラーになったサーバーですが、CentOS 7 でOpenSSLのバージョンは「1.0.2」ですので、記事のとおりにLet’sEncryptのルートCA期限切れが原因です。

オプションで証明書の検証処理を無効にする

PHPのfile_get_contentsの処理で、「verify_peer」と「verify_peer_name」を false にして、証明書をの検証などを無効化すればエラー無く通信できました。

$url = 'https://www.example.com/test.php?file=xxxxxx';
$context = stream_context_create(array(
  'ssl' => array(
  'verify_peer'      => false,
  'verify_peer_name' => false,
  )
));
$response = file_get_contents($url, false, $context);

ca-certificates を最新にする

yum で「ca-certificates」を最新にすれば、解消されました。こっちのほうが簡単ですね

$ sudo yum update ca-certificates