Transmission sécurisée - ssl/tls

Question :

Comment garantir la sécurité de la communication avec Workerman ?

Réponse :

Une méthode relativement simple consiste à ajouter une couche de cryptage SSL au-dessus du protocole de communication, par exemple, les protocoles wss et https sont tous deux basés sur le transfert crypté SSL, ce qui est très sécurisé. Workerman prend en charge SSL(nécessite Workerman>=3.3.7), il suffit de définir quelques attributs pour activer SSL.

Bien entendu, les développeurs peuvent également implémenter leur propre mécanisme de cryptage basé sur certains algorithmes de cryptage et de décryptage.

Voici comment activer ssl dans Workerman :

Pré-requis :

  1. Version de Workerman supérieure ou égale à 3.3.7

  2. PHP doit avoir installé l'extension openssl

  3. Un certificat a déjà été demandé (fichiers pem/crt et fichier key) placé dans /etc/nginx/conf.d/ssl

Code :

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// Il est préférable d'utiliser un certificat demandé
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Peut également être un fichier crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Si le certificat est auto-signé, ce choix doit être activé
    )
);
// Ici, on définit le protocole websocket, il peut également s'agir du protocole http ou d'autres protocoles
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Définir le transport pour activer ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Activation de l'indication de nom de serveur SNI (Server Name Indication)

Cela permet de lier plusieurs certificats sur une même IP et port.

Fusionner les fichiers de certificat .pem et .key :

Fusionnez le contenu de chaque fichier .pem de certificat avec son fichier .key correspondant, en ajoutant le contenu du fichier .key à la fin du fichier .pem. (Si le fichier .pem contient déjà la clé privée, cela peut être ignoré.)

Veuillez noter qu'il s'agit d'un certificat unique, pas de copier tous les certificats dans un fichier.

Par exemple, le contenu du fichier pem fusionné pour host1.com.pem ressemblera à peu près à ceci :

-----BEGIN CERTIFICATE-----
MIIGXTCBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAA....
-----END RSA PRIVATE KEY-----

Code :

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$context = array(
    'ssl' => array(
        'SNI_enabled' => true, // Activer SNI
        'SNI_server_certs' => [ // Définir plusieurs certificats
            'host1.com' => '/path/host1.com.pem', // Certificat 1
            'host2.com' => '/path/host2.com.pem', // Certificat 2
        ],
        'local_cert' => '/path/default.com.pem', // Certificat par défaut
        'local_pk'   => '/path/default.com.key',
    )
);
$worker = new Worker('websocket://0.0.0.0:443', $context);
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();