2012-06-04 126 views
12

據POCO助理規格:如何POCO C++庫使用OpenSSL正確

初始化NetSSL庫,以及底層的OpenSSL庫 通過調用波科::加密:: OpenSSLInitializer: :初始化()。 應該在使用NetSSL庫中的任何類之前調用​​。 當創建Context或SSLManager實例時,NetSSL將通過 Poco :: Crypto :: OpenSSLInitializer實例或類似機制 自動初始化。 但是,建議在應用程序啓動時調用initializeSSL() 。

當我想使用HTTPSClientSession時,我必須先構造一個Application對象嗎? 如何在客戶端使用它?任何人都可以告訴我嗎?非常感謝!

回答

10

讓我們網/樣品/ HTTPGET作爲一個例子,讓我們複製HTTPGET /作爲一個新的httpsget目錄:

  1. 開放的Makefile,加上 「PocoNetSSL」 到target_libs
  2. 與「HTTPSClientSession替換 'HTTPClientSession' '
  3. 您需要爲SSL使用創建Poco :: Net :: Context
  4. 替換'HTTPClientSession會話(uri.getHost(),uri.getPort());'有以下兩行:
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);

摘要:

  1. 添加PocoNetSSL爲LIB_DEPENDS
  2. 使用波科::與HTTPSClientSession網::語境
+2

語境:: VERIFY_NONE,「客戶:如果不使用匿名密碼(默認禁用),服務器將發送,這將是一個證書檢查,但檢查的結果將被忽略。「這不是基本上打敗證書的觀點嗎? – proteneer

+1

保護者的好處。更改爲verificationMode = Context :: VERIFY_STRICT和loadDefaultCAs = true似乎是更理智的默認值。 – thomasa88

+0

除了'VERIFY_NONE'之外的任何東西看起來確實比'VERIFY_NONE'更安全,但是一些主機_沒有有效的證書... :-( –

3

不,你不不需要Application對象。這裏是一個全功能的例子:

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

代碼:

#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

我注意到你沒有將環境傳遞給會話,是否有意? –

+0

是的,提供給initializeClient()的默認上下文將被使用:https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex