我试图在我的客户端中实施证书验证。
我总是得到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();
答案 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");