如何正确使用POCO C++库中的OpenSSL

mac*_*.ma 13 c++ https openssl poco-libraries

根据POCO助手的规格:

通过调用Poco :: Crypto :: OpenSSLInitializer :: initialize()初始化NetSSL库以及底层的OpenSSL库.应该在使用NetSSL库中的任何类之前调用​​.在创建Context或SSLManager实例时,将通过Poco :: Crypto :: OpenSSLInitializer实例或类似机制自动初始化NetSSL.但是,建议在应用程序启动时调用initializeSSL().

当我想使用时HTTPSClientSession,我是否必须首先构造一个Application对象?我如何在客户端中使用它?有人能告诉我吗?非常感谢你!

cls*_*ung 13

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

  1. 打开Makefile,将"PocoNetSSL"添加到target_libs
  2. 用'HTTPSClientSession'替换'HTTPClientSession'
  3. 你需要为SSL使用创建Poco :: Net :: Context
  4. 替换'HTTPClientSession session(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);
Run Code Online (Sandbox Code Playgroud)

摘要:

  1. 将PocoNetSSL添加为lib_depends
  2. 使用Poco :: Net :: Context和HTTPSClientSession

  • Context :: VERIFY_NONE,"客户端:如果不使用匿名密码(默认情况下禁用),服务器将发送一个将被检查的证书,但检查结果将被忽略." 这基本上不能证明证书的要点吗? (3认同)
  • proteneer 的好点子。更改为 verifyMode = Context::VERIFY_STRICT 和 loadDefaultCAs = true 似乎是更合理的默认设置。 (3认同)

Ale*_*lex 6

不,您不需要Application对象。这是一个功能齐全的示例:

$ httpsget https://httpbin.org/user-agent
{
  "user-agent": "Poco HTTPSClientSession"
}
Run Code Online (Sandbox Code Playgroud)

码:

#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;
}
Run Code Online (Sandbox Code Playgroud)