TLS клиент на C++
На данный момент я изучаю библиотеку OpenSSL, а именно хочу совершить TLS рукопожатие между клиентом и сервером. Вся документация OpenSSL на английском, да и толкового пути изучения нет. Только нашел пример самого простого TLS сервера(https://wiki.openssl.org/index.php/Simple_TLS_Server), но мне и пример клиента тоже нужен. Я буду также рад статье по реализации TLS протокола на C или C++, не важно на каком языке.
Ответы (1 шт):
Автор решения: Арсений Лашкевич
→ Ссылка
После получаса экспериментов, пришёл к такому решению:
int main ()
{
std::string host = "localhost";
std::string port = "1337";
OpenSSL_add_ssl_algorithms();
//Указываем метод которым будем пользоваться
//(в примере для сервера было SSLv23_server_method)
const SSL_METHOD *method = SSLv23_client_method();
SSL_CTX * ctx = SSL_CTX_new(method);
if (!ctx)
{
perror("Unable to create context");
return -1;
}
//Создание файлового дескриптора и так же подключение
int sock;
addrinfo hint, * server_info, * p;
memset(&hint, 0, sizeof hint);
hint.ai_family = AF_INET;
hint.ai_socktype = SOCK_STREAM;
hint.ai_protocol = IPPROTO_TCP;
int ret = getaddrinfo(host.c_str(), port.c_str(), &hint, &server_info);
if (ret != 0)
{
std::cout << "Error occured while resolving hostname" << std::endl;
return -1;
}
for (p = server_info; p != NULL; p = p->ai_next)
{
sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (sock == -1)
{
continue;
}
ret = connect(sock, p->ai_addr, p->ai_addrlen);
if (ret == -1)
{
close(sock);
continue;
}
break;
}
//Создание SSL структуры и привязка к сокету
SSL *ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);
//Как я понял это и есть рукопожатие
if (SSL_connect(ssl) <= 0)
{
std::cout << "Something went wrong" << std::endl;
}
else
{
//Аналог recv(), но для TLS
char buff [22];
SSL_read(ssl, buff, 22);
std:: cout << buff << std::endl;
}
SSL_CTX_free(ctx);
close(sock);
}