Я ищу пример подключения клиента 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 ++
Я ищу пример подключения клиента 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?
Вот обновленный пример для LibreSSL с использованием закрепленного комплекта сертификатов: C ++ libtls пример на github