2013-08-19 7 views
7

Ich versuche, eine Client-Anwendung in C++ mit Poco Libraries (Version poco-1.4.6p1-all) zu schreiben und in Visual Studio 2010 zu kompilieren, die eine HTTPS-Anfrage an einen Server sendet selbstgeschriebenes Zertifikat. Ich habe einen Fehler, da das Zertifikat nicht erkannt wird:HTTPS-Anfrage in C++ mit Poco

First-chance exception at 0x76e8c41f in httprequest.exe: Microsoft C++ exception: Poco::Net::SSLException at memory location 0x0044ed38..

Ich habe versucht, die (in X509Certificate.h) in der Bibliothek geschrieben Funktionen überprüfen zu ändern, so dass sie immer true zurück, und die Bibliothek umgebaut. Derselbe Fehler. Hier

ist der Code:

try{ 
    const Poco::URI uri("https://www.theServer.com"); 
    Poco::Net::Context::Ptr context = 
     new Poco::Net::Context(Poco::Net::Context::CLIENT_USE, "", 
     "","",Poco::Net::Context::VERIFY_RELAXED, 
     9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 

    Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> pAcceptCertHandler = new Poco::Net::AcceptCertificateHandler(true); 
    Poco::Net::SSLManager::instance().initializeClient(NULL, pAcceptCertHandler, context); 

    Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort(), context); 
    Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, ""); 
    req.setContentType("application/x-javascript; charset=utf-8\r\n"); 
    req.setKeepAlive(true); 

    Poco::Net::HTTPBasicCredentials cred("[email protected]", "lala"); 
    cred.authenticate(req); 
    session.sendRequest(req); 
    Poco::Net::HTTPResponse res; 
    std::istream& rs = session.receiveResponse(res); 
    std::string resp; 

    std::vector<Poco::Net::HTTPCookie> cookies; 
    res.getCookies(cookies); 
    res.write(std::cout); 
} 
catch(const Poco::Net::SSLException& e) 
{ 
    std::cerr << e.what() << ": " << e.message() << std::endl; 
} 
catch(const std::exception& e) 
{ 
    std::cerr << e.what() << std::endl;; 
} 

Thank you!

+0

Ich erkannte, dass diese Ausnahme unabhängig von dem Server ausgelöst wird, den ich versuche, eine Verbindung herzustellen. Könnte es von einer falschen Installation von OpenSSL kommen? – CJJ

+0

Ich fand dich Antwort. Das Problem war, dass ich das Zertifikat nicht bekommen habe. Es funktioniert wie folgt: – CJJ

Antwort

8

Ich fand die Antwort. Ich habe das Zertifikat nicht wirklich bekommen. Es funktioniert wie folgt:

try{ 
    Poco::Net::initializeSSL(); 
    Poco::SharedPtr<Poco::Net::InvalidCertificateHandler> ptrHandler = new AcceptCertificateHandler(false); 
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_RELAXED, 9, true, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    SSLManager::instance().initializeClient(0, ptrHandler, ptrContext); 

    Poco::Net::SocketAddress address("www.server.com:443"); 
    Poco::Net::SecureStreamSocket socket(address); 
    if (socket.havePeerCertificate()) 
    { 
     X509Certificate cert = socket.peerCertificate(); 
     std::cout<<cert.issuerName()<<"\n"; 
    } 
    else 
    { 
     std::cout<<"No certificate"; 
    } 

}catch (Poco::Exception& e) { 
    std::cout << "Error: " << e.displayText() << "\n"; 
    return -1; 
} 
+0

Umgeht das Zertifikat nicht nur mithilfe eines AcceptCertificateHandler (der immer Zertifikate akzeptiert, auch wenn die Überprüfung fehlschlägt)? –

+0

Ja, zu dieser Zeit haben wir diese Lösung vorübergehend verwendet, da wir ein Problem mit unseren Zertifikaten hatten. – CJJ