2013-08-19 67 views
7

Tôi đang cố gắng viết một ứng dụng khách trong C++ bằng Poco Libraries (phiên bản poco-1.4.6p1-all) và biên dịch trong Visual Studio 2010, gửi một yêu cầu HTTPS tới một máy chủ có chứng chỉ tự viết. Tôi có một lỗi vì giấy chứng nhận không được công nhận:Yêu cầu HTTPS bằng C++ sử dụng Poco

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

Tôi đã cố gắng thay đổi các chức năng bằng văn bản trong thư viện (trong X509Certificate.h) để họ luôn trở thành sự thật và xây dựng lại thư viện xác minh. Lỗi tương tự.

Đây là mã:

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

Cảm ơn bạn!

+0

Tôi nhận thấy rằng ngoại lệ này được ném bất kể máy chủ tôi cố kết nối đến. Nó có thể là do cài đặt OpenSSL không chính xác không? – CJJ

+0

Tôi tìm thấy câu trả lời. Vấn đề là tôi đã không thực sự nhận được chứng chỉ. Nó hoạt động như thế này: – CJJ

Trả lời

8

Tôi đã tìm thấy câu trả lời. Tôi đã không thực sự nhận được giấy chứng nhận. Nó hoạt động như thế này:

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

Đây có phải là không chỉ bỏ qua chứng chỉ bằng cách sử dụng một AcceptCertificateHandler (mà luôn luôn chấp nhận certs, ngay cả khi xác minh thất bại)? –

+0

Có, tại thời điểm đó, chúng tôi đã sử dụng giải pháp này tạm thời vì chúng tôi gặp sự cố với chứng chỉ của mình. – CJJ