C++ 使用cpprestsdk的证书固定&;促进
我正在尝试在[cpprestsdk][1]上实现证书固定,但迄今为止没有成功 我在http_client_config对象中看到,我们可以调用方法set_ssl_context_callback,在该方法中,将其链接到自定义证书验证方法set_verify_callback 当我调试代码时,在发送请求后调用方法*set\u verify\u callback*,但从未调用我的自定义验证方法 我在下面添加了一个示例代码,演示了上述行为C++ 使用cpprestsdk的证书固定&;促进,c++,boost,openssl,cpprest-sdk,certificate-pinning,C++,Boost,Openssl,Cpprest Sdk,Certificate Pinning,我正在尝试在[cpprestsdk][1]上实现证书固定,但迄今为止没有成功 我在http_client_config对象中看到,我们可以调用方法set_ssl_context_callback,在该方法中,将其链接到自定义证书验证方法set_verify_callback 当我调试代码时,在发送请求后调用方法*set\u verify\u callback*,但从未调用我的自定义验证方法 我在下面添加了一个示例代码,演示了上述行为 bool verify_certificate(bool pr
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;
}
bool-verify\u证书(bool-preverifyed,boost::asio::ssl::verify\u-context&ctx)
{
//此代码从未被调用
char subject_name[256];
X509*cert=X509_STORE_CTX_get_current_cert(CTX.native_handle());
X509_NAME_oneline(X509_get_subject_NAME(证书),subject_NAME,256);
std::cout我找到了一个解决方案,可以使用这个带有证书固定的库
此解决方案需要覆盖库中的方法
在文件中
重写该方法
bool处理证书验证(bool预验证,
boost::asio::ssl::verify_上下文和verifyCtx)
然后重新编译库并在项目中替换它
我已经向所有者提交了他们的主分支的解决方案,该解决方案调用set\u verify\u回调,而不是使用他们自己的实现。OWASP在中有一个OpenSSL的复制/粘贴示例。它是真正的固定;不是web和浏览器的格式副本。@jww-谢谢,但这与此无关,因为我面临的问题是回调未调用用于验证的。另外,当我尝试使用SSL*对象的本机\u句柄访问时,使用SSL\u get\u peer\u certificate(SSL)的证书为空;(我正在使用)顺便说一句,通过使用boost而不使用cpprest调用回调。“SSL对象的本机\u句柄,证书为空…”*-是的,有问题。握手完成后,您唯一会获得空服务器证书的时间是在使用匿名Diffie-Hellman(ADH)或匿名椭圆曲线Diffie-Hellman或(AECDH)时。如果您的密码套件列表中有!aNULL
,则您没有使用它们,并且证书不应为空。感谢您的回复,但您是否理解为什么没有调用verify_certificate的回调?根据boost中的规范,应使用该方法进行验证。