Transmisión Encriptada - SSL/TLS

Pregunta:

¿Cómo garantizar la seguridad en la comunicación con Workerman?

Respuesta:

Una forma conveniente es agregar una capa de encriptación SSL por encima del protocolo de comunicación, por ejemplo, los protocolos wss y https están basados en la transmisión encriptada por SSL, siendo muy seguros. Workerman soporta SSL(requiere Workerman>=3.3.7), solo es necesario establecer algunos atributos para habilitar SSL.

Por supuesto, los desarrolladores también pueden implementar su propio mecanismo de encriptación y desencriptación basado en ciertos algoritmos de encriptación.

Para habilitar SSL en Workerman, sigue estos pasos:

Preparativos:

  1. La versión de Workerman no debe ser menor a 3.3.7

  2. PHP debe tener instalada la extensión openssl

  3. Se debe haber solicitado un certificado (archivos pem/crt y archivo de key) y colocarlo en /etc/nginx/conf.d/ssl

Código:

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

// El certificado debe ser uno solicitado
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // También puede ser un archivo crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Si es un certificado auto-firmado, se necesita habilitar esta opción
    )
);
// Aquí se establece el protocolo websocket, también se puede usar http u otro protocolo
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Configurar el transporte para habilitar SSL
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Habilitar la Indicación de Nombre de Servidor SNI (Server Name Indication)

permite enlazar múltiples certificados en la misma IP y puerto.

Combinar el certificado .pem y el archivo .key:

Combina el contenido de cada .pem de certificado y su correspondiente archivo .key, añadiendo el contenido del archivo .key al final del archivo .pem. (Si el archivo .pem ya contiene la clave privada, se puede ignorar.)

Tenga en cuenta que es para un certificado individual, no para copiar todos los certificados en un solo archivo

Por ejemplo, el contenido del archivo pem después de combinar host1.com.pem sería algo similar a:

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

Código:

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

$context = array(
    'ssl' => array(
        'SNI_enabled' => true, // Habilitar SNI
        'SNI_server_certs' => [ // Establecer múltiples certificados
            'host1.com' => '/path/host1.com.pem', // Certificado 1
            'host2.com' => '/path/host2.com.pem', // Certificado 2
        ],
        'local_cert' => '/path/default.com.pem', // Certificado por defecto
        '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();