Créer un service https

Question :

Comment Workerman peut-il créer un service https afin que le client puisse communiquer via https ?

Réponse :

Le protocole https est en réalité http + SSL, c'est-à-dire qu'il ajoute une couche SSL au protocole http. Workerman prend en charge le protocole http et supporte également SSL (requiert Workerman version >=3.3.7), donc il suffit d'activer SSL sur la base du protocole http pour supporter le protocole https.

Il existe deux solutions générales pour faire en sorte que Workerman supporte https : la première consiste à activer directement SSL dans Workerman, et la seconde à utiliser nginx comme proxy SSL. Vous pouvez choisir l'une ou l'autre, mais les deux ne peuvent pas être configurées en même temps.

Activation de SSL dans Workerman

Pré-requis :

  1. Workerman version >=3.3.7

  2. PHP avec l'extension openssl installée

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

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

// Le certificat doit idéalement être un certificat demandé
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Peut aussi être un fichier crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Si c'est un certificat auto-signé, il faut activer cette option
    )
);
// Ici, le protocole http est défini
$worker = new Worker('http://0.0.0.0:443', $context);
// Définir le transport pour activer ssl, transformant http en http+SSL c'est-à-dire https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Avec le code ci-dessus, Workerman crée un service https, permettant ainsi au client de se connecter à Workerman via le protocole https pour des communications sécurisées et chiffrées.

Test :

Saisissez l'URL https://nom_de_domaine:443 dans la barre d'adresse du navigateur.

Remarque :

  1. Le port https doit être accédé en utilisant le protocole https, il ne peut pas être accédé en utilisant le protocole http.

  2. Les certificats sont généralement liés à un nom de domaine, donc lors des tests, veuillez utiliser le nom de domaine et ne pas utiliser l'IP.

  3. Si l'accès via https ne fonctionne pas, veuillez vérifier le pare-feu du serveur.

Utiliser nginx comme proxy SSL

En plus d'utiliser SSL de Workerman, vous pouvez également utiliser nginx comme proxy SSL pour mettre en œuvre https.

Remarque
L'utilisation du proxy SSL de nginx et la configuration SSL dans Workerman sont exclusives, il ne peut pas être activé en même temps.

Le principe et le flux de communication sont les suivants :

  1. Le client initie une connexion https vers nginx

  2. nginx convertit les données du protocole https en protocole http et les redirige vers le port http de Workerman

  3. Workerman reçoit les données, effectue un traitement logique métier et renvoie les données au format http à nginx

  4. nginx convertit ensuite les données http en https et les transmet au client

Exemple de configuration nginx

Conditions préalables et préparation :

  1. Supposons que Workerman écoute sur le port 8181 (protocole http)

  2. Certificat déjà demandé (fichiers pem/crt et fichier key) placé dans /etc/nginx/conf.d/ssl

  3. Prévoyez d'utiliser nginx pour ouvrir le port 443 afin d'offrir un service proxy wss (le port peut être modifié selon les besoins)

La configuration nginx est similaire à celle-ci :


upstream workerman {
    server 127.0.0.1:8181;
    keepalive 10240;
}

server {
  listen 443;
  server_name nom_de_domaine.com;
  access_log off;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
  ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

  location /
  {
    proxy_pass http://workerman;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Connection "";
  }
}