2013-08-19 5 views
7

Я пытаюсь написать клиентское приложение на C++ с использованием Poco Libraries (версия poco-1.4.6p1-all) и компиляции в Visual Studio 2010, который отправляет HTTPS-запрос на сервер, который имеет самописный сертификат. У меня есть ошибка, потому что сертификат не распознается:HTTPS-запрос в C++ с использованием Poco

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

Я попытался изменить подтверждать функции, написанные в библиотеке (в X509Certificate.h), так что они всегда возвращают истинное и восстановили библиотеку. Такая же ошибка.

Вот код:

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;; 
} 

Спасибо!

+0

Я понял, что это исключение выбрасывается независимо от сервера, к которому я пытаюсь подключиться. Возможно ли это из-за неправильной установки OpenSSL? – CJJ

+0

Я нашел тебя. Проблема в том, что я фактически не получил сертификат. Он работает следующим образом: – CJJ

ответ

8

Я нашел ответ. Я действительно не получал сертификат. Он работает следующим образом:

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

Это не просто обход сертификата с помощью AcceptCertificateHandler (который всегда принимает сертификаты, даже если проверка не выполняется)? –

+0

Да, в то время мы использовали это решение временно, так как у нас была проблема с нашими сертификатами. – CJJ

Смежные вопросы