Как правильно использовать OpenSSL в библиотеке POCO С++
В соответствии с Спецификацией в помощнике POCO:
Инициализировать библиотеку NetSSL, а также базовый OpenSSL библиотеки, вызывая Poco:: Crypto:: OpenSSLInitializer:: initialize(). Должен вызываться перед использованием любого класса из библиотеки NetSSL. NetSSL будет инициализирован автоматически, через Poco:: Crypto:: экземпляры OpenSSLInitializer или аналогичные механизмы при создании экземпляров контекста или SSLManager. Однако рекомендуется вызывать initializeSSL() в любом случае при запуске приложения.
Когда я хочу использовать HTTPSClientSession
, мне нужно сначала создать объект приложения?
Как я могу использовать его в клиенте? Любой парень может сказать мне? Большое спасибо!
Ответы
Ответ 1
В качестве примера возьмем Net/samples/httpget, позвольте скопировать httpget/в новый каталог httpsget:
- откройте Makefile, добавьте "PocoNetSSL" в target_libs
- заменить "HTTPClientSession" на "HTTPSClientSession"
- вам нужно создать Poco:: Net:: Context для использования SSL
- заменить 'сеанс 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);
Сводка:
- добавить PocoNetSSL как lib_depends
- использовать Poco:: Net:: Контекст с HTTPSClientSession
Ответ 2
Нет, вам не нужен объект 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;
}