2012-06-04 182 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