2014-07-24 6 views
2

클라이언트에서 인증서 확인을 구현하려고합니다. 저는 항상 SSL Exception: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed after 893ms을 얻었으며 유효하다고 확신합니다.이 방법으로 google.com을 시도했지만 실패했습니다. 문서 상태 때문에 RejectCertificateHandler 사용하고 있습니다 :Poco를 통해 서버 인증서를 확인할 수 없습니다.

A RejectCertificateHandler is invoked whenever an error occurs verifying the certificate. It always rejects the certificate.

A AcceptCertificateHandler is invoked whenever an error occurs verifying the certificate. It always accepts the certificate. Should be using for testing purposes only.

내가 뭘 잘못하고 있니? 나는이 번들 모든 CA 인증서가없는 맥 OS와 OpenSSL이 내장 된 것을 발견했습니다

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

나도'내재 InvalidCertificateHandler' 우리에게 출력을 표시하거나'ConsoleCertificateHandler'를 사용하여 우리에게 출력을 표시하는 것이 좋습니다 : 나는 컨텍스트를 만들 때

는 지금은이 방법을 사용합니다. 이것은 우리가 당신의 질문에 대답하는 데 도움이 될 것입니다. 어느 쪽이든, 문제는 검증 단계에 있으며 사용하는 암호 목록 일 수 있습니다. – kobigurk

+0

'경고 : 인증서 확인에 실패했습니다. ---------------------------------------- 발급 기관 이름 :/C = US/O = DigiCert Inc/OU = www.digicert.com/CN = DigiCert High Assurance EV 루트 CA/C = IE/O = 볼티모어/OU = CyberTrust/CN = 볼티모어 사이버 트러스트 루트 ' 인증서에서 오류를 생성했습니다. 로컬 발급자 인증서를 얻을 수 없습니다. – Thunder

+0

아마도 컴퓨터에 신뢰할 수있는 루트 권한으로 Digicert가 없을 것입니다. 우리가 말하는 Windows라면'certmgr.msc'를 살펴보십시오. 나는 그것이 당신의 문제라고 믿습니다. – kobigurk

답변

2

추가 연구 후 (이 시스템 키 체인 내부의 사람들을 사용하지 않습니다) : 여기에 내 코드입니다. 따라서 어떤 호스트를 검증하려고해도 인증서가 유효하더라도 실패합니다.

나는 이러한 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");