Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLOPT_SSLVERSION定数の使い方

CURLOPT_SSLVERSION定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

CURLOPT_SSLVERSION定数は、PHPのcURL拡張機能において、SSL(Secure Sockets Layer)およびTLS(Transport Layer Security)プロトコルのバージョンを明示的に指定するために使用される定数です。これにより、Webサーバーなどとの安全なデータ通信を確立する際に、利用する暗号化プロトコルのバージョンを制御します。

この定数は、curl_setopt()関数に第一引数として渡され、第二引数には使用したいSSL/TLSプロトコルバージョンを示す整数値を指定します。この整数値は、CURL_SSLVERSION_TLSv1_2CURL_SSLVERSION_TLSv1_3といった、特定のプロトコルバージョンを表す別の定数で指定するのが一般的です。

プロトコルバージョンの選択は、通信のセキュリティに直接影響します。古いSSLやTLSバージョン(例: SSLv2、SSLv3、TLSv1.0、TLSv1.1)には既知の脆弱性が存在する可能性があり、これらを使用するとセキュリティリスクが高まるため、非推奨とされています。したがって、可能な限り最新かつ安全性の高いTLSバージョンを使用することが強く推奨されます。ただし、接続先のサーバーが対応しているバージョンに合わせる必要がある点に注意が必要です。

このオプションを明示的に指定しない場合、cURLライブラリは通常、接続先サーバーとクライアント間で合意可能な最も安全で新しいプロトコルバージョンを自動的に選択しようとします。システムエンジニアを目指す方にとって、外部サービスとの連携におけるセキュリティ要件や互換性を考慮し、適切なSSL/TLSバージョンを慎重に選択する知識は非常に重要です。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
4curl_close($ch);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLでSSLバージョンを指定する

1<?php
2
3/**
4 * 指定されたURLに対して、特定のSSL/TLSバージョンを使用してHTTPリクエストを実行します。
5 *
6 * @param string $url リクエストを送信するURL。
7 * @param int $sslVersion CURLOPT_SSLVERSIONに指定するSSL/TLSバージョン定数。
8 *                        例: CURL_SSLVERSION_TLSv1_2, CURL_SSLVERSION_TLSv1_3, CURL_SSLVERSION_DEFAULT
9 * @return string|false リクエストの結果の文字列、または失敗した場合はfalse。
10 */
11function fetchUrlWithSpecificSslVersion(string $url, int $sslVersion)
12{
13    // cURLセッションを初期化
14    $ch = curl_init();
15
16    if ($ch === false) {
17        echo "エラー: cURLセッションの初期化に失敗しました。\n";
18        return false;
19    }
20
21    // リクエスト先のURLを設定
22    curl_setopt($ch, CURLOPT_URL, $url);
23    // 実行結果を文字列として返すように設定
24    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
25
26    // CURLOPT_SSLVERSION: SSL/TLSのバージョンを指定します。
27    // 通常はCURL_SSLVERSION_DEFAULT(cURLが自動で適切なバージョンを選択)が推奨されます。
28    // 特定のバージョンを指定すると、古いサーバーとの互換性やセキュリティリスクに影響を与える可能性があります。
29    curl_setopt($ch, CURLOPT_SSLVERSION, $sslVersion);
30
31    // HTTPS通信の場合、SSL証明書の検証を有効にすることが非常に重要です。
32    // 本番環境では常にtrueに設定し、適切なCA証明書が利用可能であることを確認してください。
33    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
34    // ホスト名の検証を有効にします (2は一般的なHTTPS接続で推奨される値です)。
35    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
36
37    // cURLリクエストを実行
38    $response = curl_exec($ch);
39
40    // エラーが発生した場合
41    if (curl_errno($ch)) {
42        echo 'cURLエラー: ' . curl_error($ch) . "\n";
43        $response = false;
44    }
45
46    // cURLセッションを終了
47    curl_close($ch);
48
49    return $response;
50}
51
52// サンプル使用例: 実際のHTTPSサイトへのリクエスト
53$targetUrl = 'https://www.example.com/'; // 任意のHTTPSサイトを指定してください
54
55echo "--- CURLOPT_SSLVERSION の使用例 --- \n\n";
56
57// 例1: TLSv1.2 を明示的に指定してリクエスト
58echo "{$targetUrl} へ TLSv1.2 を指定してリクエスト中...\n";
59$resultTls12 = fetchUrlWithSpecificSslVersion($targetUrl, CURL_SSLVERSION_TLSv1_2);
60if ($resultTls12 !== false) {
61    echo "成功 (レスポンスの先頭200文字): " . substr($resultTls12, 0, 200) . "...\n\n";
62} else {
63    echo "失敗しました。\n\n";
64}
65
66// 例2: TLSv1.3 を明示的に指定してリクエスト (PHP 8では利用可能です)
67echo "{$targetUrl} へ TLSv1.3 を指定してリクエスト中...\n";
68$resultTls13 = fetchUrlWithSpecificSslVersion($targetUrl, CURL_SSLVERSION_TLSv1_3);
69if ($resultTls13 !== false) {
70    echo "成功 (レスポンスの先頭200文字): " . substr($resultTls13, 0, 200) . "...\n\n";
71} else {
72    echo "失敗しました。\n\n";
73}
74
75// 例3: cURLに最適なSSL/TLSバージョンを自動選択させる (推奨される設定)
76echo "{$targetUrl} へ デフォルトのSSL/TLSバージョンでリクエスト中...\n";
77$resultDefault = fetchUrlWithSpecificSslVersion($targetUrl, CURL_SSLVERSION_DEFAULT);
78if ($resultDefault !== false) {
79    echo "成功 (レスポンスの先頭200文字): " . substr($resultDefault, 0, 200) . "...\n\n";
80} else {
81    echo "失敗しました。\n\n";
82}
83
84?>

このサンプルコードは、PHPのcURLライブラリを用いてHTTPリクエストを送信する際に、使用するSSL/TLSプロトコルのバージョンを制御する方法を解説しています。中心となるfetchUrlWithSpecificSslVersion関数は、リクエスト先のURLと、CURLOPT_SSLVERSIONに設定するSSL/TLSバージョン定数を引数として受け取ります。この関数は、リクエストが成功した場合はサーバーからのレスポンス文字列を、失敗した場合はfalseを返します。

CURLOPT_SSLVERSIONは、SSL/TLS通信で使用するプロトコルバージョン(例: TLSv1.2、TLSv1.3)を明示的に指定するためのオプションです。通常は、cURLが自動で最適なバージョンを選択するCURL_SSLVERSION_DEFAULTの使用が推奨されます。特定のバージョンを明示的に指定する際は、古いサーバーとの互換性やセキュリティ上のリスクを考慮する必要があります。PHP 8では、CURL_SSLVERSION_TLSv1_3も利用可能です。

HTTPS通信においてセキュリティを確保するため、CURLOPT_SSL_VERIFYPEERtrueに設定してSSL証明書の検証を有効にし、CURLOPT_SSL_VERIFYHOST2に設定してホスト名の検証を行うことが非常に重要です。サンプルコードでは、TLSv1.2やTLSv1.3を明示的に指定する例と、推奨されるデフォルト設定でのリクエスト例を通じて、安全かつ柔軟なcURLの使い方を示しています。

CURLOPT_SSLVERSIONは、HTTPリクエストで利用するSSL/TLSのバージョンを指定するオプションです。通常はCURL_SSLVERSION_DEFAULTを設定し、cURLに最適なバージョンを自動で選択させることが推奨されます。特定の古いバージョンを明示的に指定すると、最新のサーバーと通信できなくなったり、セキュリティ上の脆弱性を抱える原因となる可能性があります。

最も重要な注意点は、HTTPS通信においてCURLOPT_SSL_VERIFYPEERtrueCURLOPT_SSL_VERIFYHOST2に設定し、SSL証明書の検証を必ず有効にすることです。これらを無効にすると、通信が盗聴されたり、偽のサーバーに接続してしまうリスクが極めて高まります。本番環境では絶対に省略せず、安全な通信を確保してください。

関連コンテンツ