Я пытаюсь использовать безопасный веб-сокет с помощью 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 с этим кодом. Кто-нибудь может мне помочь, пожалуйста? Спасибо
В тестовом наборе это тест-водитель это делает это для вас, из конфигурационный файл.
Что касается того, как сделать это вручную, это будет выглядеть так:
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);
Спасибо за ваше разъяснение.
Во всяком случае, я нашел решение.
Это тестовый набор. И вы можете хорошо здесь — https://github.com/pocoproject/poco/tree/develop/NetSSL_OpenSSL/testsuite
Но другая проблема в том, что я не могу понять, как это работает.
Например, я думаю, что файл pem используется для сертификации, но я не знаю, как это сделать.