Winsock的SSL api?

Posted

技术标签:

【中文标题】Winsock的SSL api?【英文标题】:SSL api for winsock? 【发布时间】:2012-04-16 08:29:03 【问题描述】:

我有 windows c++ 项目。 需要在现有的 winsock 代码之上实现 ssl 客户端和服务器。

我尝试过使用 openssl,但它似乎太乱了。我认为有比openssl更好/更短/更清洁/更快的方式来实现它。 我感谢任何建议..

【问题讨论】:

【参考方案1】:

您可以使用 Windows 内置的 SSL 东西——SChannel。在 Google 中搜索“SChannel SSL”会为您提供大量信息(尽管 SChannel 本身的文档记录很差,而且不容易理解)。

另一方面,一旦你研究了一些使用 OpenSSL 的项目的源代码,OpenSSL 就不会乱七八糟。

【讨论】:

谢谢.. 尽管我发现 SChannel 似乎比 openssl 更复杂。 GnuTLS 看起来很有趣,至少方法名称等更清晰(比 openssl 等)。在我的项目中,我必须在 c++/winsock 和 python 端实现 SSL。在 python 中,我所要做的就是添加 1 行代码: -------------- c = ssl.wrap_socket(newsocket, server_side=True, certfile="servercert.pem", keyfile ="serverkey.pem", ssl_version=ssl.PROTOCOL_SSLv3) --------------- 这听起来像是愚蠢的问题,但在 C++ 中真的没有办法做到这一点吗? heikkitoivonen.net/blog/2008/10/14/ssl-in-python-26 是 python 示例。我刚刚添加了行 c = ssl.wrap_socket(newsocket, server_side=True, certfile="servercert.pem", keyfile="serverkey.pem", ssl_version=ssl.PROTOCOL_SSLv3) 并使用套接字 c 而不是 newsocket。顺便说一句,CAsyncSocketEx 似乎是 SSL 客户端的解决方案。但是没有发现可以在 c++/windows 中快速实现 SSL 服务器【参考方案2】:

实际上.. 在使用 openssl hacking 一段时间后,我不会说它那么混乱 :) 万一有人需要在现有的winsock代码中添加ssl:

现有的winsock代码是这样的:

 0: sockett.Listen etc....
    1: sockett.Accept(client, .....
    2: recv(client , ...)
    3: send(client , .....)

简而言之,如果您想在这里实现 SSL.. 删除第 2 行和第 3 行 :) 并添加:

SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
SSL_CTX *tlsctx;
SSL *ssl;
tlsctx = SSL_CTX_new( SSLv23_method());
// search google : generate self signed certificate openssl
SSL_CTX_use_certificate_file(tlsctx, "ssl\\server1.crt" , SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(tlsctx, "ssl\\server1.key", SSL_FILETYPE_PEM);
ssl = SSL_new(tlsctx);
SSL_set_fd(ssl, client);
SSL_accept(ssl);

/* instaed recv SSL_read(ssl, ....*/
/* instaed send SSL_write(ssl, ....*/


/* not 100% sure Sleep and shutdown/free/close are entirely correct here but in my code works fine */
Sleep(3000);
SSL_shutdown(ssl);   
SSL_free(ssl);
SSL_CTX_free(tlsctx);
shutdown(client, SD_BOTH);
Sleep(10);
closesocket(client);

用于测试: 在命令行运行:

openssl s_client -host localhost -port <PORT>

【讨论】:

以上是关于Winsock的SSL api?的主要内容,如果未能解决你的问题,请参考以下文章

更多 Cpp、Winsock、RSA 和 OpenSSL

Winsock重复包含

winsock2的介绍

Winsock API TCP/IP网络通信

Excel 在VBA中可否调用winsock控件

如何使用WINSOCK Api hook拦截修改socket数据包