【问题标题】:Ignore "Certificate Verification" for self-signed certificate in C++忽略 C++ 中自签名证书的“证书验证”
【发布时间】:2012-08-30 06:41:57
【问题描述】:

我正在使用 xml-rpc 库在 C++ 中运行 CGI 脚本。服务器代码位于由 Apache 运行的 /var/www/cgi-bin/ 目录中。 Apache 还配置为允许运行 cgi 的权限。现在的问题是,由于我系统上的 Apache 有一个自签名证书,当我运行客户端访问这个地址时: "https://localhost/cgi-bin/xmlrpcserver"

它给了我这个错误: 客户端抛出错误:无法将 XML 传输到服务器并返回 XML 响应。 libcurl 执行 HTTP POST 事务失败,说明:SSL 证书问题,验证 CA 证书是否正常。细节: 错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

目前,如何绕过检查证书验证来运行和测试我的应用程序。我想要 SSL 连接(加密整个通信),而我想要忽略证书验证并使用当前的自签名证书。

谢谢

【问题讨论】:

    标签: c++ apache ssl cgi xml-rpc


    【解决方案1】:

    在 xmlrpc_c 库中使用复杂客户端模式,并在 curl 传输中设置 no_ssl_verifyhost 和 no_ssl_verifypeer 选项为 true:

    #include <string>
    #include <iostream>
    #include <xmlrpc-c/client.hpp>
    
    int main()
    {
      std::string const serverUrl("https://localhost/cgi-bin/xmlrpcserver");
      std::string const methodName("sample.add");
    
      xmlrpc_c::clientXmlTransport_curl myTransport
        (xmlrpc_c::clientXmlTransport_curl::constrOpt()
         .no_ssl_verifyhost(true)
         .no_ssl_verifypeer(true)
         );
      xmlrpc_c::client_xml myClient(&myTransport);
    
      xmlrpc_c::paramList sampleAddParms;
      sampleAddParms.add(xmlrpc_c::value_int(5));
      sampleAddParms.add(xmlrpc_c::value_int(7));
    
      xmlrpc_c::rpcPtr myRpcP(methodName, sampleAddParms);
    
      xmlrpc_c::carriageParm_curl0 myCarriageParm(serverUrl);
      myRpcP->call(&myClient, &myCarriageParm);
    
      int const sum((xmlrpc_c::value_int(myRpcP->getResult())));
      std::cout << sum << std::endl;
    }
    

    【讨论】:

    • 感谢 cmets。我认为现在有些事情发生了变化。它打印网页的内容,但仍然给我同样的错误。我应该在代码中的某处使用“curl”句柄吗?或者它对整个应用程序是全局的?
    • 我理解这个问题。我以为你是直接使用libcurl,但事实并非如此。 xmlrpc_c 库自行向服务器执行 HTTP 请求。请从您的代码中删除我的建议。相反,使用复杂客户端xmlrpc-c.sourceforge.net/doc/… 并将 xmlrpc_c::clientXmlTransport_curl 与 xmlrpc_c::clientXmlTransport_curl::constrOpt().no_ssl_verifyhost(true) 一起使用。见xmlrpc-c.sourceforge.net/doc/libxmlrpc_client++.html#class_curl
    • 代码如下: string const serverUrl("localhost/cgi-bin/xmlrpcserver"); string const methodName("sample.add"); xmlrpc_c::clientSimple myClient; xmlrpc_c::value result; myClient.call (serverUrl, methodName, "ii", &result, 5, 7); int const sum = xmlrpc_c::value_int(result); cout
    • 我更新了答案。诀窍是在 xmlrpc-c 和 no_ssl_verifyhost 选项中使用复杂客户端模式。
    • 嗯,感谢您的考虑和回复。我应该为服务器端做些什么,因为我仍然有同样的问题。我的服务器端代码是这样的: xmlrpc_c::registry myRegistry; xmlrpc_c::methodPtr const sampleAddMethodP(new sampleAddMethod); myRegistry.addMethod("sample.add", sampleAddMethodP); xmlrpc_c::serverCgi myServer(xmlrpc_c::serverCgi::constrOpt().registryP(&myRegistry)); myServer.processCall();
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2021-05-20
    • 2021-12-06
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多