使用 win32api 使用 websockets 和 TLS 连接、验证和交谈

问题描述 投票:0回答:0

我正在尝试使用 Win32 API 调用与需要 TLS 的 WebSocket 服务器通信。该应用程序是一个 Windows 服务。

这是我按顺序拨打的电话清单:

  1. WinHttpOpen
  2. WinHttpConnect
  3. WinHttpOpenRequest
  4. WinHttpSetOption - WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET
  5. CertOpenStore - CERT_STORE_PROV_FILENAME_A
  6. CertFindCertificateInStore
  7. CertSetCertificateContextProperty
  8. WinHttpSetOption - WINHTTP_OPTION_CLIENT_CERT_CONTEXT
  9. WinHttpSetStatusCallback
  10. WinHttpSetOption - WINHTTP_OPTION_SECURITY_FLAGS
  11. WinHttpSendRequest
  12. WinHttpReceiveResponse
  13. WinHttpQueryHeaders
  14. WinHttpWebSocket 完成升级
  15. WinHttpWebSocketReceive

大部分调用成功返回,但连接未建立,从第7步开始返回错误

我一直在寻找一些显示正确顺序和大局概念的文章或示例,但没有找到任何东西。我的一堆关于 WebSockets 的书都没有帮助。我有这个在 Python 中工作,但我的客户需要 Win32 API。 Python 和 WireShark 让我看到了通过 TCP 逐步握手。

注意:证书在文件中,而不是在证书存储中 -

CERT_STORE_PROV_FILENAME_A
.

第 7 步之后出现第一个错误:“参数不正确”。

GetLastError()
回报:
ERROR_INVALID_PARAMETER an option flag is specified that cannot be set.

我正在传递我从

request_handle
得到的
WinHttpOpenRequest()
并传递
0
没有标志。

对文章或示例有任何深刻的想法或指导,我们将不胜感激。

可以想象,API 调用的顺序很重要,但直到

WinHttpSendRequest()
才开始在线,所以我想这之前的一切都只是为请求调用而设置。

--还有--

有谁知道微软为什么这样说 WebSocket 协议组件 API:

在 Windows 上使用 WebSocket 协议的首选方法是通过 Windows HTTP 服务 (WinHTTP) API 或 Windows.Networking.Sockets 命名空间。

是否像已弃用的那样“首选”?首选,因为我们要删除它?

拥有 WebSocket 协议组件 API 然后说我们认为您不应该使用它有什么意义?

winapi websocket tls1.2 tls1.3
© www.soinside.com 2019 - 2024. All rights reserved.