PHPでは、 socket_accept()を使用してクライアント接続を受け入れ、ネットワーク通信セキュリティを改善する一般的な方法であるOpenSSL拡張と組み合わせてTLS暗号化された伝送を実装します。この記事では、ネイティブソケットインターフェイスを使用してOpenSSL拡張機能と協力して、暗号化されたTLSベースの送信を実現する方法を紹介します。
PHPがOpenSSL拡張機能をサポートしていることを確認してください<br> PHPINFO()を介してOpenSSLモジュールが有効になっているか、コマンドラインPHP -Mを介して有効になっているかを確認してください。
証明書と秘密鍵を準備<br> OpenSSLコマンドを使用して、自己署名証明書を生成できます。例:
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
ソケットサーバーを作成<BR> Socket_Create()および関連する関数を使用して、基本的なTCPサーバーを構築します。
次の例は、socket_accept()を使用してクライアント接続を受け入れた後、OpenSSL拡張を介してTLSハンドシェイクと暗号化された通信を実行する方法を示しています。
<?php
$host = '0.0.0.0';
$port = 8443;
// 作成する TCP socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $host, $port);
socket_listen($sock);
echo "サーバーの起動,モニター {$host}:{$port}\n";
// 読み込み証明書と秘密キーパス
$certFile = '/path/to/server.crt';
$keyFile = '/path/to/server.key';
// クライアント接続を待っています
while (true) {
$clientSock = socket_accept($sock);
if ($clientSock === false) {
echo "接続を受け入れなかった\n";
continue;
}
// 作成する基于 socket の stream リソース
$clientStream = socket_export_stream($clientSock);
// 作成する SSL コンテクスト
$context = stream_context_create([
'ssl' => [
'local_cert' => $certFile,
'local_pk' => $keyFile,
'allow_self_signed' => true,
'verify_peer' => false,
]
]);
// 将普通の TCP 接続アップグレード TLS 暗号化された接続
$sslStream = stream_socket_enable_crypto($clientStream, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
if (!$sslStream) {
echo "TLS 握手は失敗しました\n";
fclose($clientStream);
socket_close($clientSock);
continue;
}
// クライアントデータをお読みください
$data = fread($clientStream, 8192);
echo "受信したデータ:$data\n";
// 応答を送信します
fwrite($clientStream, "Hello from m66.net TLS server!\n");
// 接続を閉じます
fclose($clientStream);
socket_close($clientSock);
}
socket_close($sock);
socket_export_stream()
この関数は、ソケットリソースをPHPストリームリソースに変換するため、 Stream_Socket_Enable_Crypto()を使用してTLSアップグレードを実行できます。
stream_socket_enable_crypto()
TLSの握手と暗号化の起動を担当します。 3番目のパラメーターは、サーバーモード( stream_crypto_method_tls_server )を選択し、暗号化を有効にします。
証明書設定
Stream_context_create()の証明書と秘密キーパスを渡します。この例では、 Allow_Self_Signedおよびverify_peer設定はテスト環境に適しており、正式な環境を検証する必要があります。
データ送信<br> その後のデータの読み取りと書き込みは、暗号化されたストリームを介して実行され、暗号化と復号化が自動的に完了します。
Socket_accept()およびOpenSSL拡張機能を介して、PHPはTLS暗号化された伝送を柔軟に実装して、データセキュリティを確保できます。重要なのは、ソケットリソースをストリームに変換し、暗号化とアップグレードにstream_socket_enable_crypto()を使用し、効果的な証明書管理と組み合わせて、安全な暗号化された通信サービスを簡単に構築することです。