问题描述
我在 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