最新のネットワークアプリケーションでは、安全な通信が特に重要です。 PHPは、ソケット関数とTLS/SSL暗号化プロトコルを組み合わせて、安全な暗号化された通信を実現するリッチネットワークプログラミングインターフェイスを提供します。この記事では、PHPのsocket_accept()関数を使用して、TLS/SSLとの安全な接続を実現する方法に焦点を当てます。
socket_accept() :これは、PHPのソケットプログラミングの重要な機能であり、クライアント接続要求を受け入れ、その後の通信のために新しいソケットリソースを返すために使用されます。
TLS/SSL :通信コンテンツを暗号化し、データ送信のセキュリティを確保するために使用される輸送レイヤーセキュリティ。
サーバー側では、通常、ソケットが最初に作成され、バインディングアドレスとポートは接続リクエストをリッスンするようになります。クライアントリクエストを受信した後、 socket_accept()を呼び出して接続を受け入れ、データを読み取りまたは書き込みます。
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 4433);
socket_listen($server);
$client = socket_accept($server);
$data = socket_read($client, 2048);
socket_write($client, "Hello Client!");
socket_close($client);
socket_close($server);
上記の例コードは、単純な暗号化されていない通信です。
PHP独自のSocket_*関数は、SSL/TLSを直接サポートするものではありませんが、OpenSSL拡張との安全な通信を実装するために使用できます。
クライアントに接続されたソケットリソースを受信した後、 stream_socket_enable_crypto()を使用して暗号化を有効にします。
// 作成するTCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 4433);
socket_listen($server);
// クライアント接続を受け入れます
$clientSocket = socket_accept($server);
if ($clientSocket === false) {
die("Failed to accept socket connection\n");
}
// 意思 socket リソースをに変換します stream リソース,使いやすい stream_socket_enable_crypto()
$clientStream = socket_export_stream($clientSocket);
if ($clientStream === false) {
die("Failed to convert socket to stream\n");
}
// 設定 SSL コンテクスト,証明書と秘密鍵が含まれています
$contextOptions = [
'ssl' => [
'local_cert' => '/path/to/certificate.pem', // サーバー証明書ファイル
'local_pk' => '/path/to/private_key.pem', // 秘密キーファイル
'allow_self_signed' => true,
'verify_peer' => false,
]
];
$context = stream_context_create($contextOptions);
// 起動する TLS 暗号化
if (!stream_socket_enable_crypto($clientStream, true, STREAM_CRYPTO_METHOD_TLS_SERVER, $context)) {
die("Failed to enable TLS encryption\n");
}
// クライアントデータをお読みください
$data = fread($clientStream, 2048);
echo "Received (decrypted): " . $data . "\n";
// 向客户端发送暗号化数据
fwrite($clientStream, "Welcome to secure PHP server!");
// 接続を閉じます
fclose($clientStream);
socket_close($server);
証明書の準備: local_certおよびlocal_pkファイルは有効な証明書とプライベートキーである必要があり、証明書は信頼できるCAまたは自己署名(例を示すように)によって発行される必要があります。
socket_export_stream() :低レベルのソケットリソースをストリーミングで操作できるリソースに変換し、 stream_socket_enable_crypto()を使用できます。
エラー処理:生産環境は、エラーキャプチャとロギングで良い仕事をするはずです。
安全なチャットサービス:クライアントとサーバーの間の通信コンテンツを暗号化して、データが盗聴されたり改ざんされたりしないようにする必要があります。
プライベートデータ送信:エンタープライズ内部サービスには、機密データ送信のために暗号化が必要です。
カスタムプロトコルセキュリティアップグレード:ソケットに基づくカスタムプロトコルは、セキュリティを改善するためにTLSを介して実装できます。
php socket_accept()との接続を受信した後、openSSLによって拡張されるstream_socket_enable_crypto()は、TLS/SSLに基づいて安全な暗号化された通信を簡単に実装できます。これは初心者にとっては困難ですが、一度習得すると、ネットワークアプリケーションのセキュリティを効果的に改善できます。