如何在 C++ 中使用 Tink 从安全的 websocket 中读取数据
Posted
技术标签:
【中文标题】如何在 C++ 中使用 Tink 从安全的 websocket 中读取数据【英文标题】:How to read from a secure websocket with Tink in C++ 【发布时间】:2021-07-25 16:57:57 【问题描述】:我正在开发一个需要从安全 websocket 读取的 C++ 客户端应用程序。在查看了一些 websocket 库后,我想使用easywsclient,但它不支持 TLS。我尝试按照this 文章添加对使用 OpenSSL 以 wss 开头的 URL 的支持,但希望避免从文件中加载证书和私钥(如果可能)。我研究了这是如何在 boost asio 中完成的,他们建议使用certify 来访问平台的 TLS 密钥库。我还研究了 chrome 浏览器,发现它使用了 BoringSSL,这让我找到了 Tink。但是,我找不到如何使用 Tink/BoringSSL 来保护 websocket 并处理客户端证书和密钥的示例。有人能指出我正确的方向吗?
【问题讨论】:
如果没有“加载证书和私钥”,您将无法实施 TLS。它们是 TLS 的核心基础。这是一个悬而未决的问题,通过各种 TLS 实现来实现这一点是多么简单或复杂,但必须以某种形式或方式完成,否则 TLS 毫无价值。 是的,更多的问题是如何使这项工作无缝地工作,因此我不必在每个运行 websocket 客户端的机器上设置证书和私钥文件。当您使用 chrome 访问 https 站点时,您不会被要求先设置密钥或证书。与此 python websocket 库websockets.readthedocs.io/en/stable/intro.html 相同。您无需任何额外设置或密钥配置即可从 wss 套接字读取。 更新...我能够让lws 使用 OpenSSL 与 wss websocket 一起工作,因此将围绕它编写一些 C++ 包装器。我认为我的问题与我如何将 OpenSSL 支持添加到 easywsclient 更相关。感谢任何花时间在这个问题上的人。 【参考方案1】:想要从 websocket 读取数据的客户端不必设置证书和私钥,这仅与必须支持 tls/ssl 的 web socket 服务器相关。 由于我对 C++ 了解不多,我只能给你一个 php 示例,客户端使用 TLS/SSL 连接到 websocket 服务器。在这里,客户端准备一个 $context 以使用 TLS/SSL vai 流。
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
stream_context_set_option($context, 'ssl', 'verify_peer_name', false);
稍后使用此上下文建立连接,
$this->socketMaster = stream_socket_client(
"$prot$Address$Port", $errno, $errstr, 30,
STREAM_CLIENT_CONNECT, $context
);
如需完整来源,请访问: https://github.com/napengam/phpWebSocketServer/blob/master/phpClient/websocketCore.php
【讨论】:
您好 Heinz,感谢您的回复。我在其他一些 *** 线程上看到,禁用验证可能会使您面临 MITM 攻击,因此对于采用此解决方案有点犹豫。以上是关于如何在 C++ 中使用 Tink 从安全的 websocket 中读取数据的主要内容,如果未能解决你的问题,请参考以下文章
JS周刊#403 - 庆祝V8十周年,下一代包管理Tink,Web Workers快速介绍,JavaScript更新CSS变量