Как установить соединение с сайтом по https из программы на c++?

Пользователь

от willa_will , в категории: C/C++ , год назад

Как установить соединение с сайтом по https из программы на c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от raina , год назад

@willa_will 

Для установки соединения с сайтом по https из программы на C++ можно использовать библиотеку OpenSSL.


Пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include 
#include 
#include 

void ssl_connect(const char *hostname, const int port)
{
    SSL_library_init();
    SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_client_method());

    BIO *bio = BIO_new_ssl_connect(ssl_ctx);

    BIO_get_ssl(bio, NULL);
    BIO_set_conn_hostname(bio, hostname);
    BIO_set_conn_port(bio, std::to_string(port).c_str());

    if (BIO_do_connect(bio) <= 0)
    {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("Connected to %s:%d
", hostname, port);
    }

    SSL *ssl;
    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, NULL);
    SSL_CTX_set_verify_depth(ssl_ctx, 1);
    SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);

    ssl = SSL_new(ssl_ctx);
    SSL_set_bio(ssl, bio, bio);

    if (SSL_connect(ssl) < 0)
    {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("SSL connection established
");
    }

    SSL_CTX_free(ssl_ctx);
    SSL_shutdown(ssl);
    SSL_free(ssl);
}


В данном примере используется функция ssl_connect, которая принимает на вход строку с именем хоста и число, обозначающее порт. Внутри функции происходит инициализация библиотеки OpenSSL, создание контекста SSL, установка соединения с сайтом и установка SSL соединения. Затем происходит разрыв соединения.

Пользователь

от urban_will , 4 месяца назад

@willa_will 

Этот пример кода иллюстрирует базовое соединение по HTTPS с использованием библиотеки OpenSSL в C++ программе. Однако, учитывая более сложные требования безопасности и обработки ошибок, обычно не рекомендуется использовать нативный низкоуровневый подход для работы с HTTPS в реальном проекте.


Вместо этого, для обеспечения безопасного и надежного соединения с HTTPS сайтом в C++ программе, предпочтительнее использовать более высокоуровневые библиотеки, такие как libcurl или boost.asio.


Например, с использованием libcurl код может выглядеть так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <curl/curl.h>

size_t writeCallback(void *contents, size_t size, size_t nmemb, std::string *buffer)
{
    size_t realsize = size * nmemb;
    buffer->append((char*)contents, realsize);
    return realsize;
}

int main()
{
    CURL *curl;
    CURLcode res;
    std::string readBuffer;

    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s
",
                curl_easy_strerror(res));
        }
        else
        {
            std::cout << "Received data: " << readBuffer << std::endl;
        }

        curl_easy_cleanup(curl);
    }

    return 0;
}


Такой подход через libcurl предоставляет более простой и безопасный способ установления соединения с HTTPS сайтом, а также позволяет более эффективно обрабатывать ошибки и работать с полученными данными.

Пользователь

от jakayla , 4 месяца назад

@willa_will 

Если вы всё же хотите использовать нативный низкоуровневый подход через библиотеку OpenSSL в C++, помните, что ваши функции должны быть предельно безопасными и устойчивыми к ошибкам. Управление памятью и обработка ошибок SSL соединения должны быть реализованы корректно.


Однако, если вы планируете работать с HTTPS в более сложном проекте, где требуется обработка различных кейсов и обеспечение безопасности, рекомендуется воспользоваться более высокоуровневыми библиотеками, такими как libcurl или boost.asio, которые предоставляют удобные и безопасные средства взаимодействия с HTTPS ресурсами.