使用 cpprestsdk 和 boost 固定证书
Certificate pinning using cpprestsdk & boost
我正在尝试通过 [cpprestsdk][1] 实现证书固定,但到目前为止没有成功。
我在 http_client_config 对象内部看到我们可以调用方法 set_ssl_context_callback 并在该方法内部, link 自定义证书验证方法 - 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;
}
我找到了将此库与证书固定一起使用的解决方法。
此解决方法需要重写库中的一个方法。
在文件中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 而不是使用他们自己的实现。
我正在尝试通过 [cpprestsdk][1] 实现证书固定,但到目前为止没有成功。
我在 http_client_config 对象内部看到我们可以调用方法 set_ssl_context_callback 并在该方法内部, link 自定义证书验证方法 - 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;
}
我找到了将此库与证书固定一起使用的解决方法。
此解决方法需要重写库中的一个方法。
在文件中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 而不是使用他们自己的实现。