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);
}
→ Ссылка