Crittografia del trasporto - SSL/TLS
Domanda:
Come garantire la sicurezza della comunicazione con Workerman?
Risposta:
Un metodo conveniente è quello di aggiungere uno strato di crittografia SSL sopra il protocollo di comunicazione. Ad esempio, i protocolli wss e https si basano su trasmissioni crittografate con SSL e sono molto sicuri. Workerman supporta nativamente SSL (richiede Workerman>=3.3.7
) e può essere attivato semplicemente impostando le opportune proprietà.
Naturalmente, gli sviluppatori possono anche implementare un proprio meccanismo di crittografia basato su determinati algoritmi di cifratura e decifratura.
Metodo per attivare l'SSL in Workerman:
Preparazione:
- Versione di Workerman non inferiore a 3.3.7
- Estensione openssl installata in PHP
- Certificato già richiesto (file pem/crt e file chiave) salvato in
/etc/nginx/conf.d/ssl
Codice:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// È consigliabile utilizzare un certificato richiesto
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // può anche essere 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 autogenerato, è necessario abilitare questa opzione
)
);
// In questo caso, viene impostato il protocollo websocket, ma è possibile utilizzare anche protocolli HTTP o altri
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Imposta il trasporto abilitando l'SSL
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Abilitare l'indicazione del nome del server SNI (Server Name Indication) in Workerman
Permette di associare più certificati allo stesso IP e porta.
Combinare file.pem e file .key del certificato:
Unire i contenuti dei file .pem e dei rispettivi file .key, aggiungendo alla fine del file .pem il contenuto del file .key (oppure ignorandolo se la chiave privata è già inclusa nel file .pem).
Si prega di notare che si tratta di un singolo certificato, non di copiare tutti i certificati in un unico file.
Ad esempio, dopo la fusione, il contenuto del file pem per host1.com.pem potrebbe essere approssimativamente il seguente:
-----BEGIN CERTIFICATE-----
MIIGXTCBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAA....
-----END RSA PRIVATE KEY-----
Codice:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$context = array(
'ssl' => array(
'SNI_enabled' => true, // Abilita SNI
'SNI_server_certs' => [ // Imposta più certificati
'host1.com' => '/path/host1.com.pem', // Certificato 1
'host2.com' => '/path/host2.com.pem', // Certificato 2
],
'local_cert' => '/path/default.com.pem', // Certificato predefinito
'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();