C++ 如何在POCO C+中使用OpenSSL+;正确的图书馆

C++ 如何在POCO C+中使用OpenSSL+;正确的图书馆,c++,https,openssl,poco-libraries,C++,Https,Openssl,Poco Libraries,根据POCO assistant中的规范: 初始化NetSSL库以及底层OpenSSL 库,通过调用Poco::Crypto::OpenSSLInitializer::initialize()。 应在使用NetSSL库中的任何类之前调用。 NetSSL将通过以下方式自动初始化: Poco::Crypto::OpenSSLinitalizer实例或类似机制 创建上下文或SSLManager实例时。 但是,建议调用initializeSSL() 无论如何,在应用程序启动时 当我想使用HTTPSCli

根据POCO assistant中的规范:

初始化NetSSL库以及底层OpenSSL 库,通过调用Poco::Crypto::OpenSSLInitializer::initialize()。 应在使用NetSSL库中的任何类之前调用。 NetSSL将通过以下方式自动初始化: Poco::Crypto::OpenSSLinitalizer实例或类似机制 创建上下文或SSLManager实例时。 但是,建议调用initializeSSL() 无论如何,在应用程序启动时

当我想使用
HTTPSClientSession
时,我必须先构造一个应用程序对象吗?
如何在客户端使用它?有人能告诉我吗?非常感谢

以Net/samples/httpget为例,将httpget/复制为一个新的httpsget目录:

  • 打开Makefile,将“PocoNetSSL”添加到目标库
  • 将“HTTPClientSession”替换为“HTTPSClientSession”
  • 您需要创建用于SSL的Poco::Net::上下文
  • 替换“HTTPClientSession会话(uri.getHost(),uri.getPort());”有以下两行:
  • 总结:

  • 将POCONTESSL添加为库
  • 将Poco::Net::Context与HTTPSClientSession一起使用

  • 不需要,您不需要应用程序对象。下面是一个功能完整的示例:

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

    #包括“Poco/StreamCopier.h”
    #包括“Poco/URI.h”
    #包括“Poco/Exception.h”
    #包括“Poco/SharedPtr.h”
    #包括“Poco/Net/SSLManager.h”
    #包括“Poco/Net/KeyConsoleHandler.h”
    #包括“Poco/Net/ConsoleCertificateHandler.h”
    #包括“Poco/Net/HTTPSClientSession.h”
    #包括“Poco/Net/HTTPRequest.h”
    #包括“Poco/Net/HTTPResponse.h”
    #包括
    #包括
    使用名称空间Poco;
    使用名称空间Poco::Net;
    SS2类搽剂{
    公众:
    SSLInitializer(){Poco::Net::initializeSSL();}
    ~SSLInitializer(){Poco::Net::uninitializeSSL();}
    };
    int main(int argc,字符**argv)
    {
    sSlinilizer sSlinilizer;
    SharedPtr ptrCert=新的控制台证书管理员(false);
    Context::Ptr ptrContext=新上下文(Context::CLIENT_USE,“,”,“rootcert.pem”,Context::VERIFY_STRICT,9,false,“ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH”);
    SSLManager::instance().initializeClient(0,ptrCert,ptrContext);
    尝试
    {
    如果(argc>1)
    {
    URI(argv[1]);
    httpsclients会话(uri.getHost(),uri.getPort());
    HTTPRequest请求(HTTPRequest::HTTP_GET,uri.getPath());
    set(“用户代理”、“Poco HTTPSClientSession”);
    s、 发送请求(请求);
    HTTPResponse响应;
    std::istream&rs=s.接收方响应(响应);
    StreamCopier::copyStream(rs,std::cout);
    }
    }
    捕获(例外和例外)
    {
    
    std::cout Context::VERIFY_NONE,“客户端:如果不使用匿名密码(默认禁用),服务器将发送一个将被检查的证书,但检查结果将被忽略。”这基本上不是违背了证书的观点吗?proteneer的观点很好。更改为verificationMode=Context::Verification\u STRICT和loadDefaultCAs=true似乎是一个更明智的默认值。除了
    Verification\u NONE
    之外的任何东西似乎都比
    Verification\u NONE
    更安全,但有些主机没有有效的证书……:-(我注意到您没有将上下文传递给会话,这是故意的吗?是的,将使用initializeClient()提供的默认上下文:
    $ 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;
    }