无法通过Poco验证服务器证书

时间:2014-07-24 12:28:04

标签: c++ ssl client poco

我试图在我的客户端中实施证书验证。 我总是得到SSL Exception: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed after 893ms并且我确定它有效,尝试以这种方式获取google.com并且失败了。我正在使用RejectCertificateHandler,因为文档声明:

  

每当发生错误时都会调用RejectCertificateHandler   验证证书。它总是拒绝证书。

     

每当发生错误时都会调用AcceptCertificateHandler   验证证书。它总是接受证书。应该   仅用于测试目的。

我做错了什么?这是我的代码:

Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> pAcceptCertHandler = new Poco::Net::RejectCertificateHandler(true);

Poco::Net::Context::Ptr pContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
Poco::Net::SSLManager::instance().initializeClient(NULL, pAcceptCertHandler, pContext);

Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), pContext);
std::string path(uri.getPathAndQuery());

Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, path, Poco::Net::HTTPMessage::HTTP_1_1);
initializeHttpGetRequest(request);
session.sendRequest(request);
session.setKeepAlive(true);

Poco::Timespan timespan(0, 0, 10, 0, 0);
session.setKeepAliveTimeout(timespan);

Poco::Net::HTTPResponse res;
std::istream & is = session.receiveResponse(res);

responseCode = res.getStatus();

1 个答案:

答案 0 :(得分:3)

经过深入研究后我发现,内置的OpenSSL与Mac OS没有捆绑任何CA证书(它不使用系统内部的Keychain)。因此,无论您尝试验证什么主机,即使证书有效也会失败。

我已将这些CA证书导出到单个.pem文件中,并将其与我的应用程序捆绑在一起。

现在,当我创建一个上下文时,我使用这个方法:

NSString *rootCA = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"rootCA.pem"];
Poco::Net::Context::Ptr pContext = new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", "", [rootCA UTF8String], verificationMode, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");