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:
-
Versão do Workerman igual ou superior a 3.3.7
-
PHP com a extensão openssl instalada
-
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();