2

我正在寻找 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.de\nContent-Type: application/json\nContent-Length: %d\n\n", 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 连接

4

2 回答 2

1

我正在寻找 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.de\nContent-Type: 
     application/json\nContent-Length: %d\n\n"

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

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

此外,这可能应该是:

 "POST /test.de HTTP/1.1\r\nHost: test.de\r\nContent-Type: 
     application/json\r\nContent-Length:%d\r\n\r\n"

\r\n用作新行, not\r和 not \n。double\r\n用于终止标头。您可以快速验证是否在标准中搜索“CRLF”。您将讨论 ABNF 语法。


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

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

于 2015-05-01T18:58:24.527 回答
1

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

于 2018-04-04T17:07:58.273 回答