Закрепление сертификатов с помощью cpprestsdk & boost

Я пытаюсь реализовать закрепление сертификата над [cpprestsdk][1], но пока безуспешно.

Я видел, что внутри объекта http_client_config мы можем вызвать метод set_ssl_context_callback, а внутри этого метода связать его с пользовательским методом проверки сертификата - set_verify_callback.

Когда я отлаживаю свой код, после отправки запроса вызывается метод * set_verify_callback*, но мой пользовательский метод проверки никогда не вызывается.

Я добавил пример кода ниже, который демонстрирует поведение, описанное выше.

bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
{
    // this code is never invoked
    char subject_name[256];
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
    std::cout << "Verifying:\n" << subject_name << std::endl;

    return preverified;
}


pplx::task<void> sendRequest()
{
    http_client_config config;
    config.set_validate_certificates(true);
    config.set_ssl_context_callback([](boost::asio::ssl::context& ctx)
                                    {
                                        // this code is invoked right after calling client.request
                                        ctx.set_verify_mode(boost::asio::ssl::context::verify_peer);
                                        ctx.set_verify_callback(&verify_certificate);

                                    });


    http_client client("https://google.com", config);

    http_request request(methods::GET);


    return client.request(request).then([](http_response response)
                                        {
                                            if (response.status_code() == status_codes::OK)
                                            {
                                                return response.extract_json();
                                            }

                                            return pplx::create_task([] { return json::value(); });

                                        }).then([](json::value jsonValue)
                                                {

                                                });

}


int main(int argc, const char * argv[])
{
    try
    {
        sendRequest().wait();
    }
    catch (std::exception& e)
    {
        std::wostringstream ss;
        ss << e.what() << std::endl;
        std::wcout << ss.str();

        // Return an empty task.
    }
    return 0;
}

1 ответ

Решение

Я нашел обходной путь для использования этой библиотеки с закреплением сертификата.

Этот обходной путь требует переопределить метод в библиотеке.

В файле https://github.com/Microsoft/cpprestsdk/blob/master/Release/src/http/client/http_client_asio.cpp

переопределить метод

bool handle_cert_verification(bool preverified, boost::asio::ssl::verify_context &verifyCtx)

затем перекомпилируйте библиотеку и замените ее в своем проекте.

Я представил владельцам решение для их основной ветви, которая вызывает set_verify_callback вместо использования их собственной реализации.

Другие вопросы по тегам