wss — Как подключить безопасный веб-сокет с помощью Poco в Stack Overflow

Я пытаюсь использовать безопасный веб-сокет с помощью C ++ для подключения echo.websocket.org. Это работает в JavaScript на https://www.websocket.org/echo.html

Мое решение состоит в том, чтобы использовать библиотеки Poco, и мой код выглядит следующим образом.

Poco::Net::initializeSSL();

Poco::Net::Context context(Poco::Net::Context::CLIENT_USE, "", "", "", Poco::Net::Context::VERIFY_RELAXED, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");

Poco::Net::HTTPSClientSession Client("echo.websocket.org", 443, &context);
//SSL Exception on above line

Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, "/?encoding=text", Poco::Net::HTTPMessage::HTTP_1_1);
request.set("origin", "https://www.websocket.org");
Poco::Net::HTTPResponse response;

try
{
Poco::Net::WebSocket webSocket(Client, request, response);

std::string str = "Hello!";

char receiveBuff[256];

int len = webSocket.sendFrame(str.data(), str.size(), Poco::Net::WebSocket::FRAME_TEXT);
std::cout << "Sent bytes " << len << std::endl;
int flags = 0;

int rlen = webSocket.receiveFrame(receiveBuff, 256, flags);
std::cout << "Received bytes " << rlen << std::endl;
std::cout << receiveBuff << std::endl;

webSocket.close();
}
catch (std::exception &e)
{
std::cout << "Exception " << e.what();
}

Но я получаю исключение SSL с этим кодом. Кто-нибудь может мне помочь, пожалуйста? Спасибо

1

Решение

В тестовом наборе это тест-водитель это делает это для вас, из конфигурационный файл.

Что касается того, как сделать это вручную, это будет выглядеть так:

class MyInvalidCertificateHandler: public InvalidCertificateHandler
{
public:
MyInvalidCertificateHandler(bool handleOnServerSide):
InvalidCertificateHandler(handleOnServerSide) { }

virtual ~MyInvalidCertificateHandler() { }

void onInvalidCertificate(const void*, VerificationErrorArgs& errorCert)
{
//log or something
errorCert.setIgnoreError(false);
}
};

std::string certFilename = "my/cert/filename"; // path to file
SharedPtr<InvalidCertificateHandler> ptrCert = new MyInvalidCertificateHandler(false);
Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", certFilename, VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
SSLManager::instance().initializeClient(0, ptrCert, ptrContext);
1

Другие решения

Спасибо за ваше разъяснение.
Во всяком случае, я нашел решение.
Это тестовый набор. И вы можете хорошо здесь — https://github.com/pocoproject/poco/tree/develop/NetSSL_OpenSSL/testsuite
Но другая проблема в том, что я не могу понять, как это работает.
Например, я думаю, что файл pem используется для сертификации, но я не знаю, как это сделать.

0

По вопросам рекламы [email protected]