为什么使用 PublisherInterface 将更新推送到 Mercure Hub 会引发 TransferException?

问题描述

我在 Windows 机器上的 Docker 容器中使用 Mercure Hub。我有一个 Symfony 应用程序,我想使用 Mercure 包向客户端推送消息。

/**
 * @Route("/message",name="sendMessage",methods={"POST"})
 */
public function __invoke(PublisherInterface $publisher,Request $request): RedirectResponse
{
    $update = new Update('https://chat.afsy.fr/message',json_encode([
        'message' => $request->request->get('message'),]));

    $publisher($update);

    return $this->redirectToRoute('home');
}

当我在我的客户端 javascript 中获取这个端点时(即发布一条要由集线器推送的消息),我从 HTTPClient 中的 PublisherInterface 中得到了这个异常:

传输异常

fopen():SSL 操作失败,代码为 1。OpenSSL 错误消息: 错误:1416F086:SSL 例程:tls_process_server_certificate:证书 验证失败

当我使用 Mercure 调试工具发布消息时,一切正常,但正如我们所见,使用我的 Symfony 应用程序时却没有。我想知道为什么? :)

解决方法

我以前遇到过这个错误。 简单的 Mercure Hub 需要有效的 SSL 证书才能工作,而 Symfony CLI (> symfony serve) 提供的证书不是有效的!

您可以:

  • 为您的项目添加有效的 SSL 证书。
  • 或者如果它是一个 Symfony 4 项目,你可以安装 Symfony web 服务器 composer require symfony/web-server-bundle 并使用 php bin/console server:run 在 HTTP 而不是 HTTPS 上启动服务器。
  • 您还可以使用 composer required apache-pack 安装 apache-pack 并在您的机器上设置一个虚拟主机。
,

您可以为开发环境设置 Symfony HTTP 客户端的默认选项:

# config/packages/dev/framework.yaml
framework:

  ...

  http_client:
      default_options:
          verify_peer: false