WINAPI 的本机 SSL 支持

Native SSL Support for WINAPI

我正在尝试使用 Winsock API 制作一个简单的 IRC 客户端,我想向其添加 SSL 支持。目前我只是像这样使用重叠套接字I/O:

SOCKET sock = WSASocketW(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0x02, 0x01);

if (!sock)
    return;

struct sockaddr_in ircClient;

memcpy(&ircClient.sin_addr, he->h_addr_list[0], he->h_length);
ircClient.sin_family = AF_INET;
ircClient.sin_port = wPort;

WSAEVENT hDataEvent = WSA_INVALID_EVENT;

if (WSAConnect(sock, (sockaddr*)&ircClient, sizeof(ircClient), 0, 0, 0, 0) > 0) {
    closesocket(sock);
    return;
}

if (wsWSAGetLastError() != 0) {
    closesocket(sock);
    return;
}

现在,据我了解,为了支持 SSL,我需要在 WSAConnect() 之后进行 SSL 握手。我发现旧的 Internet 帖子说 Winsock 中不支持 SSL。现在是 2017 年,95% 的网站使用 SSL。还是没有办法做到这一点?我找到了 Using Secure Socket Extensions,但它不是 SSL。

几年前,我已经 SSL/TLS 使用本机 windows API 通过标准 TCP 连接完成了一些工作,但我不熟悉这个特定的 "secure socket extension"。

我可以推荐使用 SSPI。它不会自动将您的套接字转换为 SSL,但可以很容易地用于根据请求生成 SSL request/response/data 数据包。 查找 InitializeSecurityContext 了解更多信息。