【问题标题】:How to connect secure websocket by using Poco in C++如何在 C++ 中使用 Poco 连接安全 websocket
【发布时间】:2015-11-05 04:28:35
【问题描述】:

我正在尝试通过使用 C++ 连接 echo.websocket.org 来使用安全 websocket。它在 https://www.websocket.org/echo.html 的 javascript 中工作

我的解决方案是使用 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 异常。有人可以帮我吗?谢谢

【问题讨论】:

  • 为什么不提供一些关于“SSL 例外”的更多信息。并不是说我在该特定领域具有专业知识,但当我看到“我的车钥匙不起作用”类型的问题时,我可以识别它。比如,它是不是合适的车?
  • 感谢您的澄清。无论如何,我找到了解决方案。这是github.com/pocoproject/poco/tree/develop/NetSSL_OpenSSL/… 中的一个测试套件,但另一个问题是我无法弄清楚它是如何工作的。比如我觉得pem文件是用来做认证的,但是不知道怎么做。

标签: c++ wss poco-libraries


【解决方案1】:

在测试套件中,由test driver 为您执行此操作,来自configuration file

至于如何手工操作,应该是这样的:

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);

【讨论】:

    【解决方案2】:

    感谢您的澄清。 无论如何,我找到了解决方案。 这是一个测试套件。你可以在这里很好 - https://github.com/pocoproject/poco/tree/develop/NetSSL_OpenSSL/testsuite 但另一个问题是我无法弄清楚它是如何工作的。 比如我觉得pem文件是用来做认证的,但是不知道怎么做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2012-07-13
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 2020-08-30
      • 2013-09-03
      相关资源
      最近更新 更多