Получите сертификат клиента вstream_socket_server без параметраverify_peer, для которого установлено значение true для с ⇐ Php
-
Anonymous
Получите сертификат клиента вstream_socket_server без параметраverify_peer, для которого установлено значение true для с
Я пытаюсь написать сервер Gemini на PHP.
Чтобы он работал правильно при любых обстоятельствах, мне нужно получить сертификат клиента, если клиент его отправляет.
Если я создам контекст и сокет следующим образом
$context =stream_context_create(опции: [ 'ssl' => [ 'local_cert' => "путь/к/файлу", 'local_pk' => "путь/к/ключу", 'allow_self_signed' => правда, 'verify_peer' => ложь, 'capture_peer_cert' => правда, ], ]); $socket =stream_socket_server( адрес: "tls://localhost:1965", контекст: $контекст ); Я могу принять такие связи
$connection =stream_socket_accept( сокет: $сокет, тайм-аут: -1, имя_парата: $peer ); Соединения могут быть установлены без ошибок. Но когда клиент отправляет сертификат, я не могу его получить, поскольку peer_certificate в параметрах контекста не установлен.
$streamParams =stream_context_get_params($resource); $clientCertificate = $streamParams['options']['ssl']['peer_certificate'] ?? нулевой; # всегда ноль Когда я устанавливаю для verify_peer значение true, тогда для peer_certificate устанавливается объект OpenSSLCertificate. Но тогда запросы от клиента без сертификата приводят к false $connection и этим ошибкам:
Предупреждение:stream_socket_accept(): не удалось получить сертификат узла в [...] Предупреждение:stream_socket_accept(): не удалось включить шифрование в [...] Предупреждение:stream_socket_accept(): Не удалось принять: Успех в [...] Я проверил реализации серверов Gemini на Python, и в Python есть verify_mode, для которого можно установить значение CERT_OPTIONAL.
https://docs.python.org/3/library/ssl.h ... T_OPTIONAL
Я не смог найти ничего подобного для PHP. Есть ли вообще способ получить сертификат клиента?
Я пытаюсь написать сервер Gemini на PHP.
Чтобы он работал правильно при любых обстоятельствах, мне нужно получить сертификат клиента, если клиент его отправляет.
Если я создам контекст и сокет следующим образом
$context =stream_context_create(опции: [ 'ssl' => [ 'local_cert' => "путь/к/файлу", 'local_pk' => "путь/к/ключу", 'allow_self_signed' => правда, 'verify_peer' => ложь, 'capture_peer_cert' => правда, ], ]); $socket =stream_socket_server( адрес: "tls://localhost:1965", контекст: $контекст ); Я могу принять такие связи
$connection =stream_socket_accept( сокет: $сокет, тайм-аут: -1, имя_парата: $peer ); Соединения могут быть установлены без ошибок. Но когда клиент отправляет сертификат, я не могу его получить, поскольку peer_certificate в параметрах контекста не установлен.
$streamParams =stream_context_get_params($resource); $clientCertificate = $streamParams['options']['ssl']['peer_certificate'] ?? нулевой; # всегда ноль Когда я устанавливаю для verify_peer значение true, тогда для peer_certificate устанавливается объект OpenSSLCertificate. Но тогда запросы от клиента без сертификата приводят к false $connection и этим ошибкам:
Предупреждение:stream_socket_accept(): не удалось получить сертификат узла в [...] Предупреждение:stream_socket_accept(): не удалось включить шифрование в [...] Предупреждение:stream_socket_accept(): Не удалось принять: Успех в [...] Я проверил реализации серверов Gemini на Python, и в Python есть verify_mode, для которого можно установить значение CERT_OPTIONAL.
https://docs.python.org/3/library/ssl.h ... T_OPTIONAL
Я не смог найти ничего подобного для PHP. Есть ли вообще способ получить сертификат клиента?
Мобильная версия