Criptografia de Transmissão - ssl/tls

Pergunta:

Como garantir a comunicação segura com o Workerman?

Resposta:

Uma maneira conveniente é adicionar uma camada de SSL sobre o protocolo de comunicação, como os protocolos wss e https, que são baseados na transmissão criptografada por SSL, tornando-os muito seguros. O Workerman suporta SSL (requer Workerman>=3.3.7), e você só precisa configurar as propriedades para ativar o SSL.

Claro, os desenvolvedores também podem implementar seu próprio mecanismo de criptografia baseado em alguns algoritmos de criptografia.

O método para ativar ssl no Workerman é o seguinte:

Preparativos:

  1. Versão do Workerman igual ou superior a 3.3.7

  2. PHP com a extensão openssl instalada

  3. Um certificado já solicitado (arquivos pem/crt e arquivo key) colocado em /etc/nginx/conf.d/ssl

Código:

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

// O certificado é melhor se for solicitado
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Pode ser também um arquivo crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Se for um certificado autoassinado, esta opção precisa ser ativada
    )
);
// Aqui estamos configurando o protocolo websocket, mas também pode ser http ou outros protocolos
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Configura o transport para ativar ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Ativando a Indicação de Nome do Servidor SNI (Server Name Indication)

É possível vincular múltiplos certificados em um mesmo IP e porta.

Mesclando arquivos .pem e .key de certificados:

Combine o conteúdo de cada arquivo .pem de certificado com o respectivo arquivo .key, adicionando o conteúdo do arquivo .key ao final do arquivo .pem. (Se o arquivo .pem já incluir a chave privada, isso pode ser ignorado.)

Por favor, observe que é um único certificado, não copie todos os certificados em um único arquivo.

Por exemplo, o conteúdo do arquivo pem mesclado de host1.com.pem seria parecido com:

-----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, // Ativar SNI
        'SNI_server_certs' => [ // Configurar múltiplos certificados
            'host1.com' => '/path/host1.com.pem', // Certificado 1
            'host2.com' => '/path/host2.com.pem', // Certificado 2
        ],
        'local_cert' => '/path/default.com.pem', // Certificado padrão
        '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();