Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用cpprestsdk的证书固定&;促进_C++_Boost_Openssl_Cpprest Sdk_Certificate Pinning - Fatal编程技术网

C++ 使用cpprestsdk的证书固定&;促进

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

我正在尝试在[cpprestsdk][1]上实现证书固定,但迄今为止没有成功

我在http_client_config对象中看到,我们可以调用方法set_ssl_context_callback,在该方法中,将其链接到自定义证书验证方法set_verify_callback

当我调试代码时,在发送请求后调用方法*set\u verify\u 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;
}
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中的规范,应使用该方法进行验证。