2017-06-12 109 views
3

我試圖執行證書鎖定在[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; 
} 
+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

+0

@jww - 謝謝,但它不相關,因爲我面臨的問題是不會調用驗證的回調。 另外,當我嘗試使用native_handle訪問SSL *對象時,使用SSL_get_peer_certificate(ssl)的證書爲空; (我使用https://google.com測試它) – IdoT

+0

順便說一句,通過在沒有cpprest的情況下使用boost來調用回調。 – IdoT

回答

0

我發現了一個解決方法,使用此庫與證書鎖定。

此替代方法需要重寫庫中的方法。

在文件https://github.com/Microsoft/cpprestsdk/blob/master/Release/src/http/client/http_client_asio.cpp

覆蓋的方法

布爾handle_cert_verification(布爾預驗證, 升壓:: ASIO :: SSL :: verify_context & verifyCtx)

然後重新編譯庫並將其替換到您的項目中。

我已經提交所有者的主分支的解決方案,這是調用set_verify_callback而不是使用自己的實現。