Как правильно использовать OpenSSL в библиотеке POCO C++

Согласно Спецификации помощника POCO:

Инициализируйте библиотеку NetSSL, а также базовые библиотеки OpenSSL, вызвав Poco::Crypto::OpenSSLInitializer::initialize(). Должен вызываться перед использованием любого класса из библиотеки NetSSL. NetSSL будет инициализирован автоматически с помощью экземпляров Poco::Crypto::OpenSSLInitializer или аналогичных механизмов при создании экземпляров Context или SSLManager. Однако в любом случае рекомендуется вызывать initializeSSL() при запуске приложения.

Когда я хочу использовать HTTPSClientSession, нужно ли сначала создавать объект приложения? Как я могу использовать его в клиенте? Любой парень может сказать мне? Большое спасибо!


person mac.ma    schedule 04.06.2012    source источник


Ответы (2)


Возьмем, к примеру, Net/samples/httpget, скопируем httpget/ в качестве нового каталога httpsget:

  1. откройте Makefile, добавьте «PocoNetSSL» в target_libs
  2. замените «HTTPClientSession» на «HTTPSClientSession»
  3. вам нужно создать Poco::Net::Context для использования SSL
  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. используйте Poco::Net::Context с HTTPSClientSession
person clsung    schedule 02.10.2012
comment
Context::VERIFY_NONE, Клиент: Если не используется анонимный шифр (по умолчанию отключен), сервер отправит сертификат, который будет проверен, но результат проверки будет проигнорирован. Разве это не противоречит сути сертификатов? - person proteneer; 26.01.2014
comment
Хорошее замечание от proteneer. Изменение на verifyMode = Context::VERIFY_STRICT и loadDefaultCAs = true кажется более разумным значением по умолчанию. - person thomasa88; 21.12.2014
comment
Все, кроме VERIFY_NONE, кажется действительно безопаснее, чем VERIFY_NONE, но некоторые хосты имеют недействительный сертификат... :-( - person Christian Severin; 23.10.2015

Нет, вам не нужен объект 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;
}
person Alex    schedule 26.10.2015
comment
Я заметил, что вы не передаете контекст сеансу, это намеренно? - person Jonny Paton; 29.06.2017
comment
Да, будет использоваться контекст по умолчанию, предоставленный для initializeClient(): github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/ - person Alex; 03.07.2017