Trasferimento crittografia - ssl/tls
Domanda:
Come garantire la sicurezza della comunicazione tra Workerman?
Risposta:
Un modo conveniente è aggiungere uno strato di crittografia SSL sopra il protocollo di comunicazione, ad esempio i protocolli wss e https sono tutti basati su una trasmissione criptata SSL, molto sicura. Workerman supporta SSL (è necessario Workerman>=3.3.7), è sufficiente impostare alcune proprietà per abilitare SSL.
Naturalmente, gli sviluppatori possono anche implementare un proprio meccanismo di crittografia e decrittografia basato su alcuni algoritmi.
Metodo per attivare ssl in Workerman:
Preparazione:
-
La versione di Workerman non deve essere inferiore a 3.3.7
-
PHP deve avere l'estensione openssl installata
-
È stato richiesto un certificato (file pem/crt e file key) collocato in /etc/nginx/conf.d/ssl
Codice:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// È preferibile utilizzare certificati richiesti
$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 utilizza un certificato autofirmato, attivare questa opzione
)
);
// Qui si imposta il protocollo websocket, può essere anche http o altri protocolli
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Imposta il transport per attivare ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Attivare Server Name Indication SNI in Workerman
Questo consente di associare più certificati allo stesso IP e porta.
Unire i file .pem e .key del certificato:
Unire il contenuto di ciascun file .pem del certificato con il corrispondente file .key, aggiungendo il contenuto del file .key alla fine del file .pem. (Se il file .pem include già la chiave privata, è possibile ignorare questo passaggio.)
Nota: assicurarsi che si tratti di un singolo certificato e non di copiare tutti i certificati in un unico file
Ad esempio, il contenuto del file pem dopo la fusione di host1.com.pem sarà simile a questo:
-----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, // Attiva 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();