Creare un servizio https

Domanda:

Come può Workerman creare un servizio https in modo che il client possa connettersi e comunicare tramite https?

Risposta:

Il protocollo https è in realtà http+SSL, ovvero si aggiunge uno strato SSL al protocollo http. Workerman supporta il protocollo http e supporta anche SSL (è necessario Workerman versione >=3.3.7), quindi è sufficiente attivare SSL per supportare il protocollo https.

Ci sono due soluzioni generali per far sì che Workerman supporti https: una consiste nell'attivare direttamente SSL in Workerman, mentre l'altra consiste nell'utilizzare nginx come proxy SSL. È possibile sceglierne solo una, non è possibile impostarle entrambe contemporaneamente.

Attivazione di SSL in Workerman

Prerequisiti:

  1. Workerman versione >= 3.3.7

  2. PHP con l'estensione openssl installata

  3. Certificato già richiesto (file pem/crt e file key) posizionato in /etc/nginx/conf.d/ssl

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

// È meglio utilizzare un certificato richiesto
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Può essere anche un file crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Se si tratta di un certificato autofirmato, si deve abilitare questa opzione
    )
);
// Qui si imposta il protocollo http
$worker = new Worker('http://0.0.0.0:443', $context);
// Imposta il transport per attivare ssl, trasformandolo in http+SSL ovvero https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Con il codice sopra di Workerman, è stato creato un servizio https, e il client può collegarsi a Workerman attraverso il protocollo https per realizzare comunicazioni criptate in modo sicuro.

Test:

Inserire nella barra degli indirizzi del browser https://dominio:443 per accedere.

Nota:

  1. La porta https deve essere accessibile tramite il protocollo https, non è possibile accedervi tramite il protocollo http.

  2. Il certificato è generalmente legato al nome di dominio, quindi durante il test si prega di utilizzare un nome di dominio, non un indirizzo IP.

  3. Se non è possibile accedere tramite https, controllare il firewall del server.

Utilizzare nginx come proxy ssl

Oltre ad utilizzare il SSL di Workerman, è possibile utilizzare nginx come proxy SSL per implementare https.

Attenzione
È possibile scegliere tra nginx come proxy SSL e la configurazione di SSL in Workerman, non possono essere entrambe attivate contemporaneamente.

Il principio e il flusso di comunicazione sono:

  1. Il client avvia la connessione https verso nginx

  2. nginx converte i dati del protocollo https in protocollo http e li inoltra alla porta http di Workerman

  3. Workerman riceve i dati, esegue la logica aziendale e restituisce i dati del protocollo http a nginx

  4. nginx converte nuovamente i dati del protocollo http in https e li inoltra al client

Esempio di configurazione di nginx

Prerequisiti e attività preliminari:

  1. Si presume che Workerman stia ascoltando sulla porta 8181 (protocollo http)

  2. Certificato già richiesto (file pem/crt e file key) posizionato in /etc/nginx/conf.d/ssl

  3. Si intende utilizzare nginx per attivare la porta 443 per fornire servizi di proxy wss (la porta può essere modificata a seconda delle necessità)

La configurazione di nginx sarà simile a questa:


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

server {
  listen 443;
  server_name dominio.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 "";
  }
}