2012-06-04 33 views
12

Theo Thông số kỹ thuật trong POCO trợ:Làm thế nào để sử dụng OpenSSL trong thư viện POCO C++ đúng

Khởi tạo thư viện NetSSL, cũng như OpenSSL tiềm ẩn thư viện, bằng cách gọi Poco :: Crypto :: OpenSSLInitializer: : initialize(). Nên được gọi trước khi sử dụng bất kỳ lớp nào từ thư viện NetSSL. NetSSL sẽ được tự động khởi tạo, thông qua các trường hợp Poco :: Crypto :: OpenSSLInitializer hoặc các cơ chế tương tự khi tạo các trường hợp Ngữ cảnh hoặc SSLManager. Tuy nhiên, bạn nên gọi initializeSSL() trong mọi trường hợp khi khởi động ứng dụng.

Khi tôi muốn sử dụng HTTPSClientSession, trước tiên tôi có phải xây dựng đối tượng Ứng dụng không? Tôi có thể sử dụng nó như thế nào trong Ứng dụng khách? Có ai cho tôi biết không? Cảm ơn rất nhiều!

Trả lời

10

Chúng ta hãy/mẫu Net/httpget làm ví dụ, chúng ta hãy sao chép httpget/như một thư mục httpsget mới:

  1. mở Makefile, thêm "PocoNetSSL" để target_libs
  2. thay thế 'HTTPClientSession' với 'HTTPSClientSession '
  3. bạn cần tạo Poco :: Net :: Ngữ cảnh để sử dụng SSL
  4. thay thế' phiên HTTPClientSession (uri.getHost(), uri.getPort()); ' với sau hai dòng:
const Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
HTTPSClientSession session(uri.getHost(), uri.getPort(), context);

Tóm tắt:

  1. thêm PocoNetSSL như một lib_depends
  2. sử dụng Poco :: Net :: Context với HTTPSClientSession
+2

Context :: VERIFY_NONE, "Chủ đầu tư: Nếu không sử dụng một mật mã vô danh (theo mặc định vô hiệu hóa), máy chủ sẽ gửi một giấy chứng nhận sẽ được đã kiểm tra, nhưng kết quả kiểm tra sẽ bị bỏ qua. " Điều này về cơ bản không đánh bại điểm của giấy chứng nhận? – proteneer

+1

Điểm tốt bằng giấy nhám. Thay đổi thành verifyMode = Context :: VERIFY_STRICT và loadDefaultCAs = true có vẻ như là một mặc định lành mạnh hơn. – thomasa88

+0

Bất kỳ điều gì khác ngoài 'VERIFY_NONE' dường như thực sự an toàn hơn' VERIFY_NONE', nhưng một số máy chủ _have_ không có chứng chỉ hợp lệ ... :-( –

3

Không, bạn làm không cần đối tượng Application. Dưới đây là một ví dụ đầy đủ chức năng:

$ httpsget https://httpbin.org/user-agent 
{ 
    "user-agent": "Poco HTTPSClientSession" 
} 

Code:

#include "Poco/StreamCopier.h" 
#include "Poco/URI.h" 
#include "Poco/Exception.h" 
#include "Poco/SharedPtr.h" 
#include "Poco/Net/SSLManager.h" 
#include "Poco/Net/KeyConsoleHandler.h" 
#include "Poco/Net/ConsoleCertificateHandler.h" 
#include "Poco/Net/HTTPSClientSession.h" 
#include "Poco/Net/HTTPRequest.h" 
#include "Poco/Net/HTTPResponse.h" 
#include <memory> 
#include <iostream> 

using namespace Poco; 
using namespace Poco::Net; 

class SSLInitializer { 
public: 
    SSLInitializer() { Poco::Net::initializeSSL(); } 

    ~SSLInitializer() { Poco::Net::uninitializeSSL(); } 
}; 

int main(int argc, char** argv) 
{ 
    SSLInitializer sslInitializer; 

    SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false); 
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    SSLManager::instance().initializeClient(0, ptrCert, ptrContext); 

    try 
    { 
     if (argc > 1) 
     { 
      URI uri(argv[1]); 
      HTTPSClientSession s(uri.getHost(), uri.getPort()); 
      HTTPRequest request(HTTPRequest::HTTP_GET, uri.getPath()); 
      request.set("user-agent", "Poco HTTPSClientSession"); 
      s.sendRequest(request); 
      HTTPResponse response; 
      std::istream& rs = s.receiveResponse(response); 
      StreamCopier::copyStream(rs, std::cout); 
     } 
    } 
    catch (Exception& ex) 
    { 
     std::cout << ex.displayText() << std::endl; 
     return 1; 
    } 

    return 0; 
} 
+0

Tôi nhận thấy bạn không chuyển ngữ cảnh đến phiên này, có chủ ý không? –

+0

Có, ngữ cảnh mặc định được cung cấp cho initializeClient() sẽ được sử dụng: https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex