PHP实现Gemini服务器:不启用verify_peer时获取客户端证书
PHP中实现Gemini服务器时可选获取客户端证书的方法?
我正在尝试用PHP编写一个Gemini服务器,为了让服务器在所有场景下正常工作,需要获取客户端发送的证书(如果有的话)。
我按如下方式创建上下文和socket:
$context = stream_context_create(options: [ 'ssl' => [ 'local_cert' => "path/to/file", 'local_pk' => "path/to/key", 'allow_self_signed' => true, 'verify_peer' => false, 'capture_peer_cert' => true, ], ]); $socket = stream_socket_server( address: "tls://localhost:1965", context: $context );
我按如下方式接受连接:
$connection = stream_socket_accept( socket: $socket, timeout: -1, peer_name: $peer );
连接可以正常建立,但当客户端发送证书时,我无法获取它,因为上下文参数中的peer_certificate未被设置:
$streamParams = stream_context_get_params($resource); $clientCertificate = $streamParams['options']['ssl']['peer_certificate'] ?? null; // 始终为null
当我将verify_peer设置为true时,peer_certificate会被设置为OpenSSLCertificate对象,但此时无证书的客户端发起请求会导致$connection为false,并出现以下错误:
Warning: stream_socket_accept(): Could not get peer certificate in [...] Warning: stream_socket_accept(): Failed to enable crypto in [...] Warning: stream_socket_accept(): Accept failed: Success in [...]
我查阅了Gemini服务器的Python实现,Python中有verify_mode可以设置为CERT_OPTIONAL,但在PHP中找不到类似的设置,请问PHP中是否存在可选获取客户端证书的方法?
答案:在相关PHP bug修复前,无法实现这一需求。
内容的提问来源于stack exchange,提问作者dweipert
相关产品推荐
相关产品推荐

