【ITニュース解説】エックスサーバーのPHPを8.4にしたときにCURL(認証系)で躓いたときのメモ
2025年09月19日に「Qiita」が公開したITニュース「エックスサーバーのPHPを8.4にしたときにCURL(認証系)で躓いたときのメモ」について初心者にもわかりやすく解説しています。
ITニュース概要
エックスサーバーがPHP 8.4に対応した。しかし、PHPを8.4に更新するとCURL(認証系)処理で問題が発生することが判明した。開発者は、バージョンアップ後のシステム動作確認を徹底する必要がある。
ITニュース解説
PHPは、ウェブサイトやウェブアプリケーションを動かすための重要なプログラミング言語だ。このPHPのバージョンは定期的に更新され、新しいバージョンが出るたびに、これまでの問題が改善されたり、処理が速くなったり、セキュリティが強化されたりする。最近、エックスサーバーというレンタルサーバーサービスが、新しいバージョンであるPHP 8.4に対応した。新しい技術を使えるようになるのは、開発者にとって喜ばしいことだが、同時に、これまで動いていたものが急に動かなくなるという「落とし穴」に遭遇することもある。今回の話は、まさにその「落とし穴」についてだ。
ある開発者が、自分の手元のコンピューター(これを「ローカル環境」と呼ぶ)ではPHP 8.4を使って問題なく開発を進めていた。しかし、いざ開発したシステムをインターネット上に公開するため、エックスサーバーのPHPを8.4に切り替えたところ、認証が必要な部分でエラーが発生してしまった。具体的には、外部のウェブサービスと連携するための通信処理で、問題が起きたのだ。
この通信処理には「CURL」という機能が使われていた。CURLは、ウェブページの内容を取得したり、外部のAPI(アプリケーション・プログラミング・インターフェース)にデータを送ったりするなど、様々なインターネット通信を行うための強力なツールだ。今回のケースでは、あるウェブサービスにアクセスするために、CURLを使って「私たちが正当な利用者である」ことを示す認証情報(トークンなど)を送信しようとしていた。しかし、この認証の段階で「CURL_SSL_CACERT」というエラーが発生し、通信が中断してしまったのだ。
「CURL_SSL_CACERT」というエラーメッセージは、セキュリティに関連する通信、特に「SSL/TLS通信」において、ウェブサイトの信頼性を証明する「CA証明書(ルート証明書)」が見つからない、または正しく読み込めないことを示している。SSL/TLS通信とは、インターネット上でデータを暗号化して安全にやり取りするための技術で、私たちが銀行のウェブサイトにアクセスしたり、オンラインショッピングをしたりする際に使われている。この安全な通信を確立するためには、アクセス先のウェブサイトが本当に信頼できるものか、途中で誰かに成りすまされてはいないかを検証する必要がある。その検証に不可欠なのが、CA証明書という、まるでインターネット上の「身分証明書」のようなものだ。
PHP 8.4では、このSSL/TLS通信に関するセキュリティ設定が以前のバージョンよりも厳しくなった。そのため、これまでは特に設定しなくても暗黙的に動いていたCA証明書の検証が、新しいバージョンでは「どこにCA証明書があるのかを明示的に教えてくれ」と求めるようになったのだ。システムが、信頼性を検証するためのCA証明書を見つけられなかったため、「この通信は安全ではないかもしれない」と判断し、エラーを返して処理を止めてしまった、というのが今回の根本原因だった。
この問題を解決するためには、PHPに対して「信頼できるCA証明書ファイルはここにあるよ」と教えてあげる必要がある。具体的には、「cacert.pem」というファイルを用意し、そのファイルのパスをPHPの設定で指定するのだ。この「cacert.pem」ファイルには、世界中の主要な認証局(CA)が発行したルート証明書がまとめられており、インターネット上のほとんどのウェブサイトの信頼性を検証できるようになっている。このファイルは、cURLの公式サイトなどから無料でダウンロードできる。
解決の手順は次のようになる。まず、最新の「cacert.pem」ファイルをダウンロードする。次に、ダウンロードしたファイルを、エックスサーバーのPHP 8.4が利用するディレクトリ、例えばユーザーのホームディレクトリ内にあるPHP 8.4用のディレクトリ($HOME/php/8.4/のような場所)にアップロードする。そして、PHPの設定ファイルである「php.ini」または、ユーザー固有の設定を上書きできる「.user.ini」ファイルに、openssl.cafile = /path/to/cacert.pemという一行を追加する。ここで/path/to/cacert.pemの部分は、先ほどアップロードしたcacert.pemファイルの正確なパスに置き換える。この設定をすることで、PHPはCURLでSSL/TLS通信を行う際に、指定されたパスからCA証明書を読み込み、正しく相手の信頼性を検証できるようになる。設定を適用した後、ウェブサーバーを再起動したり、サーバー管理画面からPHPのバージョン変更を再適用したりすることで、変更が反映され、CURLの認証エラーは解決するはずだ。
ちなみに、一時的な回避策として、CURLのオプションでSSL証明書の検証を無効にするCURLOPT_SSL_VERIFYPEERをfalseに設定する方法もある。しかし、この方法はセキュリティを著しく低下させるため、絶対に推奨されない。SSL証明書の検証を無効にすると、通信相手が本当に意図したサーバーなのかを確認できなくなり、悪意のある第三者による「なりすまし」や「盗聴」のリスクが高まってしまうため、安易に使うべきではない。
今回の件から学べることは多い。まず、プログラミング言語のバージョンアップは、新しい機能や改善をもたらす一方で、既存のコードや設定に影響を与える可能性があるという点だ。特にセキュリティに関する部分は、新しいバージョンでより厳格な基準が導入されることがよくある。次に、開発を行っているローカル環境と、実際にウェブサイトが公開される本番環境では、設定や環境が異なる場合があるため、両方の環境でテストすることの重要性だ。そして、インターネット通信においてSSL/TLSの重要性や、CA証明書が果たす役割を理解することは、安全なシステムを構築する上で不可欠だ。
システムエンジニアを目指す上で、このようなエラーに直面し、その原因を究明し、適切な解決策を講じる経験は非常に貴重だ。エラーメッセージは一見難解に見えるが、そのメッセージが何を示しているのかを一つずつ紐解いていくことで、システムの仕組みやセキュリティの基礎について深く学ぶことができる。今回の事例は、PHPのバージョンアップとセキュリティ、そしてインターネット通信の基本的な仕組みを学ぶ良い機会となるだろう。