Dans PHP, socket_accept () est utilisé pour accepter les connexions client et implémenter la transmission cryptée TLS en combinaison avec une extension OpenSSL, qui est une méthode courante pour améliorer la sécurité de la communication réseau. Cet article présentera comment utiliser l'interface de socket native pour coopérer avec les extensions OpenSSL pour réaliser une transmission basée sur TLS cryptée.
Assurez-vous que PHP prend en charge les extensions OpenSSL <br> Vérifiez si le module OpenSSL est activé via phpinfo () ou la ligne de commande php -m .
Préparer le certificat et la clé privée <br> Vous pouvez utiliser la commande OpenSSL pour générer un certificat auto-signé, exemple:
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
Créer un serveur de socket <br> Utilisez socket_create () et les fonctions connexes pour créer un serveur TCP de base.
L'exemple suivant montre comment effectuer la poignée de main TLS et la communication cryptée via une extension OpenSSL après avoir accepté une connexion client à l'aide de socket_accept () .
<?php
$host = '0.0.0.0';
$port = 8443;
// créer TCP socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $host, $port);
socket_listen($sock);
echo "Startup de serveur,moniteur {$host}:{$port}\n";
// Certificat de chargement et chemin de clé privée
$certFile = '/path/to/server.crt';
$keyFile = '/path/to/server.key';
// En attente de la connexion du client
while (true) {
$clientSock = socket_accept($sock);
if ($clientSock === false) {
echo "Échec de l'acceptation de la connexion\n";
continue;
}
// créer基于 socket de stream ressource
$clientStream = socket_export_stream($clientSock);
// créer SSL Contexte
$context = stream_context_create([
'ssl' => [
'local_cert' => $certFile,
'local_pk' => $keyFile,
'allow_self_signed' => true,
'verify_peer' => false,
]
]);
// 将普通de TCP Mise à niveau de connexion vers TLS Connexion cryptée
$sslStream = stream_socket_enable_crypto($clientStream, true, STREAM_CRYPTO_METHOD_TLS_SERVER);
if (!$sslStream) {
echo "TLS La poignée de main a échoué\n";
fclose($clientStream);
socket_close($clientSock);
continue;
}
// Lire les données du client
$data = fread($clientStream, 8192);
echo "Données reçues:$data\n";
// Envoyer une réponse
fwrite($clientStream, "Hello from m66.net TLS server!\n");
// Fermer la connexion
fclose($clientStream);
socket_close($clientSock);
}
socket_close($sock);
socket_export_stream ()
Cette fonction convertit les ressources de socket en ressources de flux PHP, afin que vous puissiez utiliser stream_socket_enable_crypto () pour effectuer une mise à niveau TLS.
stream_socket_enable_crypto ()
Responsable du démarrage de la poignée de main et du chiffrement TLS. Le troisième paramètre sélectionne le mode serveur ( Stream_Crypto_Method_TLS_Server ) et permet le cryptage.
Configuration de certificat
Passez le certificat et le chemin de la clé privée dans stream_context_create () . Dans l'exemple, les paramètres Allow_Self_Signed et Verify_peer conviennent à l'environnement de test, et l'environnement formel doit être validé.
Transmission de données <br> La lecture et l'écriture des données ultérieures sont effectuées via le flux chiffré, et le cryptage et le décryptage sont automatiquement terminés.
Grâce à socket_accept () et à une extension OpenSSL, PHP peut implémenter de manière flexible la transmission cryptée TLS pour assurer la sécurité des données. La clé est de convertir les ressources de socket en flux, d'utiliser Stream_Socket_enable_Crypto () pour le chiffrement et la mise à niveau, et de le combiner avec une gestion efficace de certificat pour créer facilement un service de communication crypté sécurisé.