Пример OpenSSL или LibreSSL C ++ для клиентского соединения TLS

Я ищу пример подключения клиента TLS в C ++. Лучше всего для 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, чтобы он сказал мне больше).

Поэтому я ищу рабочий образец или как получить соединение TLS с собственным сертификатом, работающим на C ++

1

Решение

Я ищу пример подключения клиента TLS в C ++.

Я думаю, что есть пара портов OpenSSL для C ++. Они пытаются сделать полную оболочку класса. Увидеть класс openssl ++ в гугле

Когда я использую его в C ++, я использую уникальные указатели для очистки. Смотрите, например, Как правильно печатать RSA * как строку в C ++?. Я использую его в первую очередь для обеспечения очистки. я считать это похоже на Приобретение ресурсов — это инициализация шаблон.

OpenSSL также предоставляет страницу для похожих библиотек и фреймворков. Увидеть Ссылки по теме страница в OpenSSL вики.


Но это не на

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 используется как новая строка, а не \r и не \n, Двойной \r\n используется для завершения заголовка. Вы можете быстро подтвердить поиск «CRLF» в стандарте. Вы окажетесь в обсуждении грамматики ABNF.


Поэтому я ищу рабочий образец или как получить соединение TLS с собственным сертификатом, работающим на C ++

Хитрость здесь в том, чтобы создать правильно сформированный сертификат. Для этого смотрите Как создать самозаверяющий сертификат с помощью openssl?

1

Другие решения

Вот обновленный пример для LibreSSL с использованием закрепленного комплекта сертификатов: C ++ libtls пример на github

1

По вопросам рекламы [email protected]