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

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

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

作成日: 更新日:

基本的な使い方

STREAM_CRYPTO_METHOD_SSLv3_SERVER定数は、PHPのストリームコンテキストにおいて、サーバー側でSSLv3プロトコルによる暗号化通信を有効にするためのオプションを表す定数です。この定数は、stream_context_create()関数で作成されるストリームコンテキストのsslオプション内のcrypto_methodキーに設定され、過去にサーバーソケットがSSLv3接続を受け入れる際に利用されました。

しかし、SSLv3プロトコルにはPOODLE攻撃などの深刻なセキュリティ脆弱性が存在するため、現在では非推奨です。この定数を使用すると重大なセキュリティリスクを招く可能性があり、現代のシステム開発では使用を避けるべきです。代わりに、TLSv1.2やTLSv1.3といった、より新しく安全なバージョンのTLSプロトコルを使用することが強く推奨されます。互換性維持といった特殊な状況を除き、新たなアプリケーションではこの定数を利用せず、最新のセキュリティ基準に準拠した安全な通信手段を選択してください。

構文(syntax)

1<?php
2echo STREAM_CRYPTO_METHOD_SSLv3_SERVER;
3?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP: stream_socket_enable_cryptoでSSLv3サーバーを起動する

1<?php
2
3/**
4 * SSL/TLS証明書と秘密鍵のパスを指定します。
5 * このファイルは、OpenSSLを使用して事前に生成する必要があります。
6 * 例: openssl req -new -x509 -days 365 -nodes -out server.pem -keyout server.pem
7 */
8const CERT_FILE = __DIR__ . '/server.pem'; // スクリプトと同じディレクトリに証明書があると仮定
9
10/**
11 * STREAM_CRYPTO_METHOD_SSLv3_SERVER 定数を使用して、
12 * ストリームの暗号化を有効にするTCPサーバーのサンプルを示します。
13 *
14 * 【重要】STREAM_CRYPTO_METHOD_SSLv3_SERVER は、セキュリティ上の脆弱性があるSSLv3プロトコルを使用します。
15 *         本番環境では、より安全なTLSv1.2またはTLSv1.3などのプロトコルを使用することを強く推奨します。
16 */
17function runSslv3ServerExample(): void
18{
19    $host = '127.0.0.1';
20    $port = 8443;
21
22    // SSL/TLS設定のためのストリームコンテキストを作成します。
23    $context = stream_context_create([
24        'ssl' => [
25            'local_cert' => CERT_FILE,          // サーバー証明書と秘密鍵のファイルパス
26            'verify_peer' => false,             // クライアント証明書の検証を無効化 (サンプル用)
27            'allow_self_signed' => true,        // 自己署名証明書を許可 (サンプル用)
28        ],
29    ]);
30
31    // TCPサーバーソケットを作成します。
32    // 'ssl://' プレフィックスではなく 'tcp://' を使用し、後からstream_socket_enable_cryptoで暗号化を有効にします。
33    $server = @stream_socket_server("tcp://{$host}:{$port}", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
34
35    if (!$server) {
36        echo "エラー: サーバーの作成に失敗しました: {$errstr} ({$errno})\n";
37        return;
38    }
39
40    echo "SSLv3 サーバーが {$host}:{$port} で起動しました。クライアントの接続を待機中...\n";
41
42    // クライアントからの接続を受け入れます。
43    $client = @stream_socket_accept($server, -1); // タイムアウトなし
44
45    if (!$client) {
46        echo "エラー: クライアント接続の受け入れに失敗しました。\n";
47        fclose($server);
48        return;
49    }
50
51    echo "クライアントが接続しました。ストリームの暗号化を有効にします...\n";
52
53    // STREAM_CRYPTO_METHOD_SSLv3_SERVER を使用して、ストリームの暗号化を有効にします。
54    // STREAM_CRYPTO_METHOD_SSLv3_SERVER は、サーバー側でSSLv3プロトコルを使用することを示します。
55    // STREAM_CRYPTO_SERVER を組み合わせることで、サーバーモードで暗号化ハンドシェイクが行われます。
56    $crypto_enabled = stream_socket_enable_crypto(
57        $client,
58        true, // 暗号化を有効にする (true)
59        STREAM_CRYPTO_METHOD_SSLv3_SERVER | STREAM_CRYPTO_SERVER
60    );
61
62    if (!$crypto_enabled) {
63        echo "エラー: 暗号化の有効化に失敗しました。\n";
64        fclose($client);
65        fclose($server);
66        return;
67    }
68
69    echo "ストリームの暗号化が成功しました (SSLv3 サーバーモード)。\n";
70
71    // 暗号化されたストリームを通じてクライアントと通信します。
72    $message_to_client = "こんにちは、暗号化されたサーバーです!";
73    fwrite($client, $message_to_client . "\n");
74    echo "クライアントにメッセージを送信しました: \"{$message_to_client}\"\n";
75
76    $response_from_client = trim(fgets($client));
77    if ($response_from_client !== false) {
78        echo "クライアントからメッセージを受信しました: \"{$response_from_client}\"\n";
79    } else {
80        echo "エラー: クライアントからのメッセージの読み取りに失敗しました。\n";
81    }
82
83    // ストリームを閉じます。
84    fclose($client);
85    echo "クライアント接続を閉じました。\n";
86    fclose($server);
87    echo "サーバーをシャットダウンしました。\n";
88}
89
90// サンプル関数を実行します。
91runSslv3ServerExample();

このPHPサンプルコードは、STREAM_CRYPTO_METHOD_SSLv3_SERVER定数を使用して、SSLv3プロトコルによる暗号化通信を有効にしたTCPサーバーの構築方法を実演しています。

STREAM_CRYPTO_METHOD_SSLv3_SERVER定数は、引数を取らず、戻り値もありません。この定数は、主にstream_socket_enable_crypto関数に渡されることで、サーバー側でSSLv3プロトコルを用いてストリームの暗号化ハンドシェイクを行うことを指定します。

コードでは、まずtcp://プレフィックスで通常のTCPサーバーソケットを作成し、クライアントからの接続を受け入れます。その後、stream_socket_enable_crypto関数を呼び出し、第一引数で暗号化対象のストリーム、第二引数に暗号化を有効にするか(true)、そして第三引数にSTREAM_CRYPTO_METHOD_SSLv3_SERVERSTREAM_CRYPTO_SERVERを組み合わせて暗号化方式とモードを指定します。この関数は、暗号化が成功した場合はtrue、失敗した場合はfalseを返します。これにより、クライアントとの通信がSSLv3で暗号化されます。

しかし、SSLv3プロトコルにはセキュリティ上の脆弱性が存在するため、本番環境での使用は強く推奨されません。このサンプルは、暗号化ストリームの仕組みを学習する目的として参照し、実際のシステムではTLSv1.2またはTLSv1.3などのより新しい安全なプロトコルを利用すべきです。

このサンプルコードは、セキュリティ上の脆弱性があるSSLv3プロトコルをサーバー側で利用する例です。そのため、本番環境での利用は絶対に避けてください。実際のシステムでは、STREAM_CRYPTO_METHOD_TLSv1_2_SERVERSTREAM_CRYPTO_METHOD_TLSv1_3_SERVERなど、より安全なTLSプロトコルを指定する定数を使用することが不可欠です。コードを実行するには、OpenSSLで事前にサーバー証明書ファイル(server.pem)を生成し、スクリプトと同じディレクトリに配置する必要があります。サンプルでは自己署名証明書を許可し、クライアント証明書の検証を無効にしていますが、実際の運用では信頼できる認証局の証明書を使用し、セキュリティ設定を適切に行うことで、安全な通信を確立することが重要です。

PHP 8: STREAM_CRYPTO_METHOD_SSLv3_SERVER でSSLv3サーバーを起動する

1<?php
2
3/**
4 * STREAM_CRYPTO_METHOD_SSLv3_SERVER 定数の使用例(PHP 8)
5 *
6 * この定数は、PHPのストリームコンテキストオプションの一部として使用され、
7 * サーバー側で SSLv3 プロトコルを有効にすることを示します。
8 *
9 * !!! 警告 !!!
10 * SSLv3 は現在、セキュリティ上の重大な脆弱性(POODLE攻撃など)が発見されており、
11 * 非推奨のプロトコルです。本番環境での使用は絶対に避けるべきです。
12 * 現代のセキュアなアプリケーションでは、TLS (Transport Layer Security) プロトコルを使用する
13 * STREAM_CRYPTO_METHOD_TLS_SERVER (サーバー側) や STREAM_CRYPTO_METHOD_TLS_CLIENT (クライアント側)
14 * などの定数を使用することを強く推奨します。
15 *
16 * このサンプルは、STREAM_CRYPTO_METHOD_SSLv3_SERVER の使い方を示すための教育目的のコードです。
17 */
18
19/**
20 * 非セキュアな SSLv3 サーバーを設定し、クライアントからの接続を待ち受けます。
21 *
22 * @param string $host サーバーがリッスンするホストアドレス。
23 * @param int $port サーバーがリッスンするポート番号。
24 * @return void
25 */
26function runInsecureSslv3Server(string $host = '127.0.0.1', int $port = 8443): void
27{
28    // ダミーのSSL/TLS証明書と秘密鍵のパスを指定します。
29    // このデモを実行するには、事前に有効な自己署名証明書と秘密鍵を生成し、
30    // このスクリプトと同じディレクトリに 'server.crt' と 'server.key' として配置してください。
31    //
32    // 例: OpenSSLコマンドで自己署名証明書を生成する方法
33    // openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
34    $certPath = __DIR__ . '/server.crt';
35    $keyPath = __DIR__ . '/server.key';
36
37    if (!file_exists($certPath) || !file_exists($keyPath)) {
38        echo "エラー: 証明書ファイル ('$certPath') または秘密鍵ファイル ('$keyPath') が見つかりません。\n";
39        echo "デモを実行するには、上記ファイルを生成して配置してください。\n";
40        return;
41    }
42
43    // ストリームコンテキストオプションを設定します。
44    // 'ssl' キーの下で、SSL/TLS接続に関する設定を行います。
45    $contextOptions = [
46        'ssl' => [
47            'local_cert'        => $certPath,          // サーバーの証明書パス
48            'local_pk'          => $keyPath,            // サーバーの秘密鍵パス
49            'allow_self_signed' => true,                // 自己署名証明書を許可(開発・デモ目的のみ)
50            'verify_peer'       => false,               // クライアントの証明書検証を無効化(開発・デモ目的のみ)
51            // !!! 警告 !!! ここで STREAM_CRYPTO_METHOD_SSLv3_SERVER を使用します。
52            // これはSSLv3プロトコルを許可する設定であり、セキュリティ上の重大なリスクがあります。
53            'crypto_method'     => STREAM_CRYPTO_METHOD_SSLv3_SERVER,
54            // 現代的なアプリケーションでは、より安全なTLSプロトコルファミリーを使用します。
55            // 例えば、以下の定数を使用することを強く推奨します:
56            // 'crypto_method' => STREAM_CRYPTO_METHOD_TLS_SERVER,
57            // または特定のTLSバージョンを指定する場合:
58            // 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_SERVER | STREAM_CRYPTO_METHOD_TLSv1_3_SERVER,
59        ],
60    ];
61
62    // ストリームコンテキストを作成します。
63    // このコンテキストは、ソケットがどのように動作するかを定義します。
64    $context = stream_context_create($contextOptions);
65
66    // サーバーソケットを作成し、指定されたホストとポートでリッスンします。
67    // 'ssl://' プレフィックスを使用することで、SSL/TLS暗号化が有効になります。
68    $serverSocket = stream_socket_server(
69        "ssl://$host:$port",
70        $errno,
71        $errstr,
72        STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
73        $context
74    );
75
76    if (!$serverSocket) {
77        echo "エラー: サーバーソケットの作成に失敗しました: ($errno) $errstr\n";
78        return;
79    }
80
81    echo "警告: SSLv3サーバーが $host:$port で起動しました (重大なセキュリティリスクあり)。\n";
82    echo "このサーバーは SSLv3 接続のみを受け入れます。\n";
83    echo "このサンプルは教育目的であり、本番環境での使用は絶対に避けてください。\n";
84    echo "Ctrl+C で終了します。\n";
85
86    // 無限ループでクライアントからの接続を待ち受けます。
87    while (true) {
88        // クライアントからの接続を待ちます。タイムアウトは無限 (-1)。
89        $clientSocket = stream_socket_accept($serverSocket, -1);
90
91        if ($clientSocket) {
92            echo "クライアントが接続しました。\n";
93            $response = "警告: あなたは非推奨で危険なSSLv3プロトコルで接続しました。\n";
94            fwrite($clientSocket, $response); // クライアントに警告メッセージを送信
95            fclose($clientSocket); // 接続を閉じます
96            echo "メッセージを送信し、クライアントとの接続を閉じました。\n";
97        }
98    }
99
100    // スクリプトが終了する際にソケットを閉じますが、
101    // 無限ループのため通常ここには到達しません。
102    fclose($serverSocket);
103}
104
105// スクリプトが直接実行された場合にサーバーを起動します。
106runInsecureSslv3Server();

STREAM_CRYPTO_METHOD_SSLv3_SERVERは、PHP 8で提供される定数で、ストリームコンテキストオプションの一部として利用されます。この定数を設定することで、PHPがネットワーク通信を行う際に、サーバー側でSSLv3プロトコルを有効にするよう指定できます。

しかしながら、SSLv3プロトコルにはPOODLE攻撃をはじめとする重大なセキュリティ上の脆弱性が発見されており、現代においては非推奨とされています。そのため、この定数を本番環境のアプリケーションで使用することは絶対に避けなければなりません。

より安全な通信を実現するためには、TLS (Transport Layer Security) プロトコルを使用することが強く推奨されます。例えば、STREAM_CRYPTO_METHOD_TLS_SERVER (サーバー側) や STREAM_CRYPTO_METHOD_TLS_CLIENT (クライアント側) といった定数を代わりに利用してください。

この定数自体は直接的な引数を取らず、特定の値(通常は整数のビットマスク)を示すものです。そのため、特定の役割を持つ戻り値もありません。提供されたサンプルコードは、この定数の使い方を教育目的で示すものであり、そのセキュリティリスクを理解した上で参照することが重要です。

このサンプルコードは、PHPにおけるSTREAM_CRYPTO_METHOD_SSLv3_SERVER定数の使用方法を示す教育目的のものです。STREAM_CRYPTO_METHOD_SSLv3_SERVERが示すSSLv3プロトコルには重大なセキュリティ上の脆弱性が存在するため、本番環境での使用は絶対に避けてください。

安全な通信を確立するためには、STREAM_CRYPTO_METHOD_TLS_SERVERやSTREAM_CRYPTO_METHOD_TLS_CLIENTといった、より新しいTLSプロトコル関連の定数を使用することを強く推奨します。サンプルコードを実行するには、事前に自己署名証明書と秘密鍵を用意する必要がありますが、実運用では信頼できる認証局から発行された証明書を利用し、allow_self_signedverify_peerなどのセキュリティオプションを適切に設定し、通信相手の証明書検証を厳格に行うことが重要です。このコードはセキュリティリスクを伴うため、学習用途以外での利用は控え、常に最新の安全な通信プロトコルを選択してください。

関連コンテンツ

関連IT用語

関連プログラミング言語