客户端TLS连接的OpenSSL或LibreSSL C++示例



我正在C++中搜索客户端TLS连接示例。最适合Visual Studio,但老实说,它可以是任何编译器。我发现了几个C样品。但没有人工作。我从C中的这个示例开始:https://wiki.openssl.org/index.php/SSL/TLS_Client

但在上失败了

res = BIO_do_connect(web);

如果我想连接到我自己的node.js服务器(使用直接ip地址),则使用"系统库",或者使用encrypted.google.com作为url使用"错误主机名查找"。与libressl和Visual Studio 2013配合使用。

下一站:http://fm4dd.com/openssl/sslconnect.htm

在这里程序运行成功。但是任何写入SSL连接的尝试最后都带有:

std::string json = "{'test':'huhu'}";
char buff[1024];
sprintf(buff, "POST /test.de HTTP/1.1 nHost: test.denContent-Type: application/jsonnContent-Length: %dnn", json.length());
std::string post = buff;
int snd = SSL_write(ssl, post.data(), post.length());
snd = SSL_write(ssl, json.data(), json.length());

强制服务器关闭连接(我不知道到底发生了什么,因为我现在不知道如何告诉node.js告诉我更多)。

因此,我搜索了一个工作示例,或者如何在C++中使用自己的证书获得TLS连接

我正在C++中搜索客户端TLS连接示例。

我认为有几个OpenSSL到C++的端口。他们试图做全类包装器的事情。请参阅Google上的openssl++类。

当我在C++中使用它时,我使用唯一的指针进行清理。例如,请参阅"如何在C++中正确地将RSA*打印为字符串?"?。我使用它主要是为了确保清理。我认为类似于资源获取是初始化模式。

OpenSSL还为类似的库和框架提供了一个页面。请参阅OpenSSL wiki上的"相关链接"页面。


但在上失败

res = BIO_do_connect(web);

用";系统库";如果我想连接到我自己的node.js服务器(使用>直接ip地址);坏主机名查找";

我的猜测是证书中的名称与要连接的URL中使用的名称不匹配。

通过在host文件中添加一个条目,可以使名称起作用。实际上,这是您的本地DNS覆盖。请参阅Microsoft TCP/IP主机名解析顺序。

或者,您可以生成一个具有所有必需名称的证书。为此,请参阅如何使用openssl创建自签名证书?


强制服务器关闭连接(我不知道到底发生了什么,因为我现在不知道如何告诉node.js告诉我更多)。

"POST /test.de HTTP/1.1 nHost: test.denContent-Type: 
application/jsonnContent-Length: %dnn"

由于您缺少Connection: close请求标头,服务器可能遵循RFC 7230,HTTP/1.1消息语法和路由,第6.1节:

不支持持久连接的服务器必须发送"关闭";每个响应消息中的connection选项具有1xx(信息)状态代码。

此外,可能应该是:

"POST /test.de HTTP/1.1rnHost: test.dernContent-Type: 
application/jsonrnContent-Length:%drnrn"

rn用作新行,而不是rn。双rn用于终止报头。您可以快速验证正在搜索"CRLF">在标准中。你将进入ABNF语法的讨论。


所以我搜索一个工作示例,或者如何在C++中使用自己的证书获得TLS连接

这里的诀窍是创建一个格式良好的证书。为此,请参阅如何使用openssl创建自签名证书?

以下是LibreSSL使用固定证书捆绑包的更新示例:github 上的C++libtls示例

最新更新