我試圖執行證書鎖定在[cpprestsdk] [1],迄今沒有成功。證書鎖定使用cpprestsdk&boost
我在裏面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;
}
OWASP在[Certificate and Public Key Pinning](https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning)上有OpenSSL的複製/粘貼示例。它真正的固定;而不是來自[RFC 7469](https://tools.ietf.org/html/rfc7469)的網頁和瀏覽器的演繹。 – jww
@jww - 謝謝,但它不相關,因爲我面臨的問題是不會調用驗證的回調。 另外,當我嘗試使用native_handle訪問SSL *對象時,使用SSL_get_peer_certificate(ssl)的證書爲空; (我使用https://google.com測試它) – IdoT
順便說一句,通過在沒有cpprest的情況下使用boost來調用回調。 – IdoT