You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:31:08