【ITニュース解説】CURLOPT_SSL_VERIFYPEERについて
2025年09月30日に「Qiita」が公開したITニュース「CURLOPT_SSL_VERIFYPEERについて」について初心者にもわかりやすく解説しています。
ITニュース概要
CURLOPT_SSL_VERIFYPEERは、HTTPS通信で接続先のサーバー証明書が正しいか検証する設定だ。通常は検証する(true)が、これをfalseにすると検証せず接続するため、セキュリティ上の危険性がある。
ITニュース解説
インターネットを使ったサービスやアプリケーションを開発する上で、外部のサーバーと安全に通信することは非常に重要だ。例えば、Webサイトから情報を取得したり、API(アプリケーション・プログラミング・インターフェース)を使って別のサービスと連携したりする場合、その通信が盗聴されたり、偽のサーバーとやり取りしてしまったりする事態は避けなければならない。ここで登場するのが、HTTPSという安全な通信プロトコルと、それを支えるTLS(Transport Layer Security)という技術だ。
CURLという言葉を知っているだろうか。これは、プログラムからインターネット上の様々なプロトコルを使ってデータ転送を行うための強力なツールであり、ライブラリでもある。多くのプログラミング言語で利用され、HTTPやHTTPS、FTPなど、様々な通信に対応している。Web開発やシステム連携では頻繁に利用される。
今回解説する「CURLOPT_SSL_VERIFYPEER」というオプションは、このCURLを使ってHTTPS通信を行う際に、相手のサーバーが本当に信頼できる相手なのか、つまり「本物」であることを確認するための非常に重要な設定項目だ。
HTTPS通信では、サーバーが自身の身元を証明するために「サーバー証明書」という電子的な証明書を提示する。この証明書には、そのWebサイトの運営元や有効期限などの情報が含まれており、さらに「認証局(CA: Certificate Authority)」と呼ばれる信頼された第三者機関によって署名されている。認証局は、運転免許証センターや公証役場のように、証明書が本物であることを保証する役割を担っている。
「CURLOPT_SSL_VERIFYPEER」というオプションが「true」に設定されている場合、CURLはサーバーから提示された証明書が、信頼できる認証局によって発行され、改ざんされておらず、有効期限内であるかなどを厳密に検証する。この「検証」によって、私たちは偽のサーバー(例えば、個人情報を盗み取ろうとするフィッシングサイトなど)と誤って通信してしまうことを防ぐことができる。これが、インターネットの安全を保つ上で非常に大切な仕組みなのだ。
このオプションのデフォルト値は「true」となっている。これは、CURLを利用する際に特別な設定をしなくても、安全な通信が保証されるように配慮されているためだ。ほとんどのケースで、このデフォルト値を変更する必要はない。むしろ、変更すべきではない。
しかし、この「CURLOPT_SSL_VERIFYPEER」を意図的に「false」に設定することも可能だ。falseに設定するということは、CURLが相手サーバーの証明書を一切検証しない、つまり「このサーバーが本物であるかどうかは気にしない」という状態になることを意味する。これは非常に危険な行為であり、セキュリティ上の重大なリスクを伴う。
証明書の検証を行わないと、どのような問題が起きるのだろうか。最も典型的なのは「中間者攻撃(Man-in-the-Middle Attack)」と呼ばれるものだ。これは、通信している二者(例えばあなたのプログラムと、アクセスしたいWebサーバー)の間に攻撃者が入り込み、双方の通信を盗聴したり、内容を改ざんしたりする攻撃手法だ。検証が有効な場合は、攻撃者が偽の証明書を提示しても、CURLはその証明書を信頼できないと判断し、通信を停止してくれる。しかし、検証を無効にしていると、CURLは偽の証明書であっても受け入れてしまい、あなたのプログラムは攻撃者のサーバーと安全だと信じて通信を続けてしまう可能性がある。その結果、IDやパスワード、クレジットカード情報といった機密情報が盗まれたり、不正なデータが送信されたりする恐れがある。
では、なぜこのような危険な設定が許されているのだろうか。それは、開発やテストといった特定の状況において、一時的に検証を無効にせざるを得ないケースが存在するためだ。例えば、開発中のシステムでは、まだ正式な認証局から発行された証明書ではなく、「自己署名証明書」と呼ばれる、開発者自身がテスト目的で作成した証明書を使用することがよくある。このような自己署名証明書は、信頼された認証局による署名がないため、デフォルト設定のままではCURLが「信頼できない証明書」と判断し、通信がエラーになってしまう。この場合、開発者は一時的に「CURLOPT_SSL_VERIFYPEER」をfalseに設定して、開発を進めることがある。
また、社内ネットワークや特定のクローズドな環境において、独自の証明書システムを運用している場合や、非常に古いOSや環境で、必要なCA証明書バンドル(信頼できる認証局の証明書リスト)が不足しているために通信ができないといった稀なケースでも、一時的な回避策としてfalseが選択されることがある。
しかし、これらのケースはあくまで一時的、あるいは限定的なものだ。特に、インターネットに公開されている本番環境のシステムで「CURLOPT_SSL_VERIFYPEER」をfalseに設定することは、絶対にしてはならない。本番環境でこの設定を使用するということは、あなたのシステムが常に中間者攻撃のリスクに晒されている状態であり、ユーザーのデータ保護に対する責任を放棄しているに等しい。システムエンジニアとして、このようなセキュリティホールを作ってしまうことは、開発者としての信頼を失うだけでなく、企業にとって甚大な被害をもたらす可能性もある。
もし、自己署名証明書など、デフォルトのCA証明書リストでは検証できない証明書を扱う必要がある場合は、より安全な代替手段がある。それは、「CURLOPT_CAINFO」や「CURLOPT_CAPATH」といったオプションを使って、利用したい証明書の情報をCURLに明示的に伝える方法だ。
「CURLOPT_CAINFO」オプションを使うと、特定のCA証明書ファイルを指定することができる。これにより、CURLはデフォルトの証明書リストに加えて、指定されたファイル内の証明書も信頼するようになる。例えば、自己署名証明書を信頼したい場合は、その自己署名証明書を生成するのに使ったCA証明書(または自己署名証明書そのもの)をファイルとして用意し、そのファイルを指定すれば、検証機能自体は有効なまま、目的のサーバーと安全に通信することが可能になる。
また、「CURLOPT_CAPATH」オプションを使えば、複数のCA証明書ファイルが格納されているディレクトリを指定できる。CURLはそのディレクトリ内の証明書ファイルを検索し、適切な証明書を見つけて検証に利用する。これにより、柔軟かつ安全に証明書の検証を行うことができる。
これらのオプションを使うことで、証明書の検証機能は有効にしたまま、特定の環境や要件に対応することが可能になるのだ。システムエンジニアを目指す上では、利便性とセキュリティのバランスを理解し、常に安全な方法を選択する意識を持つことが非常に重要だ。「CURLOPT_SSL_VERIFYPEER」をfalseに設定することは、手軽な解決策に見えるかもしれないが、それはセキュリティという大きな代償を伴う「安易な解決策」であることを肝に銘じておきたい。常に、デフォルトの「true」を維持し、特別な理由がある場合は、上述したような代替の安全な方法を検討することが、あなたのシステムとユーザーを守るための基本中の基本となる。