Mã hóa truyền tải - ssl/tls

Hỏi:

Làm thế nào để đảm bảo an toàn cho truyền thông giữa Workerman?

Đáp:

Một cách tiện lợi để thực hiện là thêm một lớp mã hóa SSL lên trên giao thức truyền thông, chẳng hạn như wss, https đều dựa trên việc mã hóa truyền tải SSL, rất an toàn. Workerman hỗ trợ SSL (cần Workerman>=3.3.7), chỉ cần thiết lập thuộc tính để bật SSL.

Tất nhiên, các nhà phát triển cũng có thể triển khai một cơ chế mã hóa và giải mã riêng dựa trên một số thuật toán mã hóa nhất định.

Cách bật ssl trong Workerman như sau:

Chuẩn bị:

  1. Phiên bản Workerman không nhỏ hơn 3.3.7

  2. PHP đã cài đặt mở rộng openssl

  3. Đã xin cấp chứng chỉ (tập tin pem/crt và tập tin key) và để ở /etc/nginx/conf.d/ssl

Mã:

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

// Chứng chỉ tốt nhất là chứng chỉ đã xin cấp
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Cũng có thể là tập tin crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Nếu là chứng chỉ tự ký cần bật tùy chọn này
    )
);
// Ở đây thiết lập là giao thức websocket, cũng có thể là giao thức http hoặc giao thức khác
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Thiết lập transport bật ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Bật chỉ dẫn tên máy chủ SNI (Server Name Indication)

Cho phép liên kết nhiều chứng chỉ trong cùng một IP và cổng.

Gộp các chứng chỉ .pem và tệp .key:

Gộp nội dung của tệp .pem và tệp .key tương ứng của mỗi chứng chỉ, thêm nội dung tệp .key vào cuối tệp .pem. (Nếu tệp .pem đã chứa khóa riêng, bạn có thể bỏ qua.)

Lưu ý rằng đây là từng chứng chỉ đơn lẻ, không phải sao chép tất cả chứng chỉ vào một tệp

Ví dụ, nội dung của tệp pem đã gộp của host1.com.pem có thể như sau:

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

Mã:

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

$context = array(
    'ssl' => array(
        'SNI_enabled' => true, // Bật SNI
        'SNI_server_certs' => [ // Thiết lập nhiều chứng chỉ
            'host1.com' => '/path/host1.com.pem', // Chứng chỉ 1
            'host2.com' => '/path/host2.com.pem', // Chứng chỉ 2
        ],
        'local_cert' => '/path/default.com.pem', // Chứng chỉ mặc định
        '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();