Шифрование передачи - ssl/tls
Вопрос:
Как обеспечить безопасность связи с Workerman?
Ответ:
Сравнительно удобный способ - это добавить уровень шифрования SSL поверх протокола связи, например, протоколы wss и https основаны на шифровании SSL и являются очень безопасными. Сам Workerman поддерживает SSL (требуется Workerman>=3.3.7), достаточно задать атрибуты для включения SSL.
Конечно, разработчики также могут реализовать собственный механизм шифрования на основе определенных алгоритмов шифрования и дешифрования.
Метод включения ssl в Workerman выглядит следующим образом:
Подготовка:
-
Версия Workerman не менее 3.3.7
-
PHP установлено расширение openssl
-
Получен сертификат (pem/crt файл и ключевой файл), который помещен в /etc/nginx/conf.d/ssl
Код:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Сертификат лучше получить
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // Также может быть файл crt
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // Если это самоподписанный сертификат, нужно включить эту опцию
)
);
// Здесь установлен протокол websocket, также может быть http или другие протоколы
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Настройка transport для включения ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Включение Server Name Indication SNI в Workerman позволяет привязать несколько сертификатов на одном IP-адресе и порту.
Объединение сертификатов .pem и .key файлов:
Объедините содержимое каждого сертификата .pem и соответствующего ему .key файла, добавив содержимое .key файла в конец .pem файла. (Если .pem файл уже содержит частный ключ, это можно пропустить.)
Обратите внимание, что речь идет о единственном сертификате, а не о копировании всех сертификатов в один файл.
Например, содержимое объединенного файла pem для host1.com.pem может выглядеть следующим образом:
-----BEGIN CERTIFICATE-----
MIIGXTCBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAA....
-----END RSA PRIVATE KEY-----
Код:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$context = array(
'ssl' => array(
'SNI_enabled' => true, // Включить SNI
'SNI_server_certs' => [ // Установка нескольких сертификатов
'host1.com' => '/path/host1.com.pem', // Сертификат 1
'host2.com' => '/path/host2.com.pem', // Сертификат 2
],
'local_cert' => '/path/default.com.pem', // Сертификат по умолчанию
'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();