2017-10-09 166 views
0

我正在嘗試使用Winsock API製作一個簡單的IRC客戶端,我希望爲其添加SSL支持。目前,我只是用我重疊的套接字/ O這樣的:對WINAPI的本地SSL支持

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握手。我發現舊的互聯網帖子說Winsock沒有SSL支持。現在是2017年,95%的網站使用SSL。還有沒有辦法做到這一點?我發現Using Secure Socket Extensions,但它不是SSL。

+0

WinSock本身仍然不支持SSL,爲true。但是,Microsoft的[SChannel API](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123.aspx)可以,您可以將現有的WinSock代碼用於SChannel的I /加密的SSL數據。請參閱[使用Schannel創建安全連接](https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa374782.aspx)。否則,請使用第三方SSL庫。 OpenSSL非常普遍,它可以在你現有的WinSock代碼之上使用(通過它的'BIO' API)。或者,您可以重新編寫代碼,讓它爲您處理所有的套接字I/O –

回答

0

我已經使用本機windows API在幾年前完成了一些SSL/TLS的標準TCP連接,但我並不熟悉這個特定的「安全套接字擴展」。

我可以推薦使用SSPI。它不會自動將您的套接字轉換爲SSL,但可以很容易地根據請求生成SSL請求/響應/數據包。 尋找InitializeSecurityContext瞭解更多信息。