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

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

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

作成日: 更新日:

基本的な使い方

OPENSSL_TLSEXT_SERVER_NAME定数は、インターネット上で安全な通信を行うための技術であるTLS(Transport Layer Security)における、SNI(Server Name Indication)拡張機能の存在や状態を表す定数です。

TLSは、ウェブサイトへのアクセスやデータの送受信において、通信内容が盗聴されたり改ざんされたりするのを防ぎ、データのプライバシーと完全性を保証するために広く利用されています。SNIは、一つのIPアドレスを持つサーバーが複数の異なるドメイン名(ウェブサイト)を運用している場合に非常に重要な役割を果たします。クライアント(例えばウェブブラウザやPHPスクリプト)がどのドメイン名のウェブサイトにアクセスしたいのかをTLSハンドシェイク時にサーバーに伝えることで、サーバーは正しいデジタル証明書を選択し、安全な接続を確立することが可能になります。

このOPENSSL_TLSEXT_SERVER_NAME定数自体は、SNI機能を直接有効化・無効化する設定値ではなく、OpenSSLライブラリがSNI拡張をサポートしていることを示す内部的な識別子、またはSNIに関連するコンテキストオプションの文脈で利用される可能性のあるフラグとして扱われます。PHPでstream_context_create関数などを用いてSSL/TLS接続を確立する際、'ssl'コンテキストオプションの中で、接続先のホスト名を指定することでSNI機能が自動的に活用されることが多いです。この定数を理解することは、そうした安全なネットワーク通信の仕組みを深く理解し、適切な設定を行う上で役立ちます。

構文(syntax)

1<?php
2echo OPENSSL_TLSEXT_SERVER_NAME;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

OPENSSL_TLSEXT_SERVER_NAME 定数情報表示

1<?php
2
3/**
4 * OpenSSL拡張機能のOPENSSL_TLSEXT_SERVER_NAME定数に関する情報を示す関数です。
5 *
6 * この定数は、TLS拡張のServer Name Indication (SNI) 機能に関連しています。
7 * SNIは、単一のIPアドレスとポート番号で複数のSSL/TLS証明書をホストすることを可能にします。
8 *
9 * 通常、この定数はPHPの内部処理でSNIのサポートや状態を示すために利用されます。
10 * PHP 7.0.0 以降、SSL/TLSコンテキストオプションの 'SNI_enabled' は非推奨となり、
11 * デフォルトでSNIは有効になっているため、アプリケーションコードでこの定数を直接設定することは稀です。
12 * しかし、定数自体はOpenSSL拡張機能がSNIをサポートしていることを示します。
13 *
14 * @return void
15 */
16function showOpensslTlsextServerNameInfo(): void
17{
18    // OPENSSL_TLSEXT_SERVER_NAME 定数が定義されているかを確認
19    if (defined('OPENSSL_TLSEXT_SERVER_NAME')) {
20        // 定数の値を出力
21        echo "定数 OPENSSL_TLSEXT_SERVER_NAME の値: " . OPENSSL_TLSEXT_SERVER_NAME . PHP_EOL;
22        echo "これはOpenSSL拡張機能におけるTLSのServer Name Indication (SNI) に関連する定数です。" . PHP_EOL;
23        echo "SNIは、1つのIPアドレスで複数のHTTPSドメインをホストするために利用されます。" . PHP_EOL;
24    } else {
25        echo "定数 OPENSSL_TLSEXT_SERVER_NAME は定義されていません。" . PHP_EOL;
26        echo "OpenSSL拡張がPHPで有効になっているか確認してください。" . PHP_EOL;
27    }
28}
29
30// 関数を実行し、定数に関する情報を表示
31showOpensslTlsextServerNameInfo();

PHPのOPENSSL_TLSEXT_SERVER_NAMEは、OpenSSL拡張機能に属する定数の一つです。この定数は、安全なインターネット通信を実現するTLS(Transport Layer Security)プロトコルにおける「Server Name Indication(SNI)」という機能に関連しています。SNIは、一つのサーバー(同じIPアドレスとポート番号)で複数のHTTPSウェブサイトを運用する際に、クライアントがどのドメインに接続したいかをサーバーに伝えるための技術です。これにより、サーバーは接続要求に応じて適切なSSL/TLS証明書を選択し、安全な通信を開始できるようになります。

OPENSSL_TLSEXT_SERVER_NAME定数自体は、OpenSSL拡張機能がSNIをサポートしていることを示す内部的な識別子として機能します。通常、この定数の値をアプリケーションコードから直接設定することはほとんどなく、PHPの内部でSNIの処理や状態を示すために利用されます。PHP 7.0.0以降ではSNIはデフォルトで有効であるため、特別な設定は不要な場合が多いです。

提供されたサンプルコードは、現在のPHP環境でOPENSSL_TLSEXT_SERVER_NAME定数が定義されているかを確認し、その存在と値、そしてTLSのSNIに関連する定数であることを出力します。これにより、OpenSSL拡張機能がSNIに対応しているかどうかを簡単に確認することができます。この定数自体に引数や戻り値はありません。

この定数は、TLSのSNI機能に関連するものですが、PHP 7.0.0以降はSNIがデフォルトで有効なため、通常アプリケーションコードで直接設定することは稀です。主にOpenSSL拡張機能がSNIをサポートしていることを示す目的で利用されます。コード中で定数を利用する際は、defined()関数でその定数が存在するかを事前に確認する習慣を持つことが大切です。定数が未定義の場合、OpenSSL拡張がPHPで正しく有効になっているかを確認してください。この定数自体は戻り値を持つものではなく、その値を利用したり、存在を確認したりするものです。

PHP OpenSSL SNI有効HTTPSリクエスト

1<?php
2
3/**
4 * OpenSSL_TLSEXT_SERVER_NAME 定数の利用例とSNIを有効にしたHTTPSリクエスト
5 *
6 * この定数は、TLS (Transport Layer Security) の Server Name Indication (SNI) 拡張機能に
7 * 関連する定数で、値は通常1です。
8 * SNIは、一つのIPアドレスで複数のHTTPSサイトをホストしているサーバーに対して、
9 * クライアントがどのサイトに接続したいかを伝えるために使われます。
10 * PHPでHTTPS通信を行う際、ストリームコンテキストオプションを通じてSNIを制御できます。
11 */
12function makeHttpsRequestWithSni(): void
13{
14    // OPENSSL_TLSEXT_SERVER_NAME 定数の値を確認します。
15    // この定数は、SNIを有効にするためのブール値 (true/1) として使用できます。
16    echo "OPENSSL_TLSEXT_SERVER_NAME の値: " . OPENSSL_TLSEXT_SERVER_NAME . PHP_EOL;
17
18    // 接続先のHTTPS URLを設定します。
19    $url = 'https://www.google.com/';
20
21    // SSL/TLS接続のためのストリームコンテキストオプションを設定します。
22    $contextOptions = [
23        'ssl' => [
24            // 'SNI_enabled' オプションを true (または 1) に設定することで、SNIを有効にします。
25            // ここでは OPENSSL_TLSEXT_SERVER_NAME 定数を値として直接使用し、
26            // この定数がSNI機能と関連していることを示します。
27            'SNI_enabled' => OPENSSL_TLSEXT_SERVER_NAME, // 値は1なので true と同じ意味になります
28            // サーバー証明書の検証を有効にします(セキュリティ上、常に推奨されます)。
29            'verify_peer' => true,
30            'verify_peer_name' => true,
31            // 自己署名証明書は許可せず、システムの信頼されたCA証明書を使用します。
32            'allow_self_signed' => false,
33        ],
34    ];
35
36    // 設定したオプションでストリームコンテキストを作成します。
37    $context = stream_context_create($contextOptions);
38
39    echo "{$url} へのHTTPSリクエストをSNI有効で送信中..." . PHP_EOL;
40
41    // file_get_contents を使用してHTTPSリクエストを実行します。
42    // 作成したコンテキストを渡すことで、設定したSSL/TLSオプションが適用されます。
43    // @ をつけてエラー出力を抑制し、エラーメッセージを後で取得します。
44    $response = @file_get_contents($url, false, $context);
45
46    if ($response === false) {
47        $error = error_get_last();
48        echo "エラーが発生しました: " . ($error['message'] ?? '不明なエラー') . PHP_EOL;
49    } else {
50        echo "リクエスト成功!受信したデータの最初の200バイト:" . PHP_EOL;
51        // 受信した内容がUTF-8であると仮定して表示します。
52        echo mb_substr($response, 0, 200) . "..." . PHP_EOL;
53        echo "(取得データは一部のみ表示されています)" . PHP_EOL;
54    }
55}
56
57// 関数を実行します。
58makeHttpsRequestWithSni();

PHPのOPENSSL_TLSEXT_SERVER_NAMEは、OpenSSL拡張機能に属する定数です。この定数は、TLS(Transport Layer Security)プロトコルにおけるServer Name Indication (SNI) 拡張機能と関連しています。SNIは、クライアントがHTTPS接続を確立する際に、接続したいサーバー名を伝えることで、一つのIPアドレスで複数のウェブサイトをホストしているサーバーが適切なSSL/TLS証明書を提示できるようにする仕組みです。

この定数自体には引数や戻り値はありませんが、その値は通常1(真)です。サンプルコードでは、この定数の値をHTTPストリームコンテキストオプションのssl設定内にあるSNI_enabledキーに指定することで、SNIを有効にしています。これにより、file_get_contents()関数を使って外部のHTTPSサイトへリクエストを送信する際、クライアントは目的のサーバー名を正確に伝えることができ、複数の仮想ホストを持つ環境でも正しく接続が行われます。このように、OPENSSL_TLSEXT_SERVER_NAME定数は、PHPで安全かつ正確なHTTPS通信を行う上で、SNIの有効化に役立つ指標として利用できます。

OPENSSL_TLSEXT_SERVER_NAME定数は、HTTPS通信におけるSNI(Server Name Indication)を有効にするために利用される値です。一つのIPアドレスで複数のHTTPSサイトをホストするサーバーでは、SNIを有効にしないと正しく接続できない可能性がありますのでご注意ください。

セキュリティを確保するため、サンプルコードのようにverify_peerとverify_peer_nameはtrueに、allow_self_signedはfalseに設定することを強く推奨します。これらを適切に設定しないと、中間者攻撃など、セキュリティ上のリスクが高まります。

また、file_get_contentsなどでネットワーク通信を行う際は、通信エラーに備え、必ず戻り値をチェックし、error_get_last()で詳細なエラー情報を取得するエラーハンドリングを実践してください。

関連コンテンツ

関連IT用語

関連プログラミング言語