Закрепление сертификата с использованием cpprestsdk & amp; увеличение

Я пытаюсь реализовать закрепление сертификата над [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;
}

3

Решение

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

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

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

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

bool handle_cert_verification (bool preverified,
повышение :: ASIO :: :: verify_context SSL &verifyCtx)

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

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

0

Другие решения

Других решений пока нет …