PHP/Swoole Http Server – как я могу динамически загружать ssl?

Мне нужно загружать разные ssl-сертификаты на лету, по запросу процесса. Я пытаюсь сделать это, как в коде ниже, но сервер все еще загружает сертификат cert1 при обработке запроса, а не cert2, как я пытаюсь сделать в коде.

Как я могу динамически перезагружать разные сертификаты на лету? Является ли это возможным?

Пример кода:

<?php

require 'vendor/autoload.php';


$server = new swoole_http_server("192.168.10.10", 443, SWOOLE_BASE, SWOOLE_SOCK_TCP | SWOOLE_SSL);

// setup the location of ssl cert files and key files
$ssl_dir = __DIR__.'/ssl_certs';
$server->set([
    'max_conn'           => 500,
    'daemonize'          => false,
    'dispatch_mode'      => 2,
    'buffer_output_size' => 2 * 1024 * 1024,
    'ssl_cert_file' => $ssl_dir . '/cert1.local.crt',
    'ssl_key_file' => $ssl_dir . '/cert1.local.key',
    'open_http2_protocol' => true, // Enable HTTP2 protocol
]);

$server->on('request', function ($request, $response) use ($server) {
    $server->set([
        'ssl_cert_file' => $ssl_dir . '/cert2.local.crt',
        'ssl_key_file' => $ssl_dir . '/cert2.local.key',
    ]);
    $response->end("<h1>Hello World. #".rand(1000, 9999)."</h1>");
});

$server->start();


person Efim Romanov    schedule 26.01.2019    source источник


Ответы (2)


К сожалению, вы не можете изменить конфигурацию $server на лету.

Можно запустить сервер Swoole на нескольких портах с разными настройками:

$port1 = $server->listen("127.0.0.1", 9501, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$port2 = $server->listen("127.0.0.1", 9502, SWOOLE_SOCK_TCP | SWOOLE_SSL);

$port1->set([
    'open_eof_split' => true,
    'package_eof' => "\r\n",
    'ssl_cert_file' => 'ssl1.cert',
    'ssl_key_file' => 'ssl1.key',
]);

$port2->set([
    'open_eof_split' => true,
    'package_eof' => "\r\n",
    'ssl_cert_file' => 'ssl2.cert',
    'ssl_key_file' => 'ssl2.key',
]);

После этого вы можете создать разные правила для разных URI в Nginx, чтобы обрабатывать трафик и перенаправлять его на правильный порт Swoole.

person Valentin Borisov    schedule 10.10.2019

Вам просто нужно несколько сертификатов для предоставления SSL для разных доменных имен?

Если это так, вы можете просто разместить несколько доменов в одном сертификате. Это сняло бы требование переключения сертификатов.

person Phippsy    schedule 14.04.2020