14

我正在开发一个 Qt 应用程序,该应用程序通过 WebSocket 与我的 Web 浏览器(目前是 Google Chrome)进行通信。

一切正常,直到我尝试使用安全的 websockets ......

我设法解决了我在使用 OpenSSL 时遇到的问题,所以现在我应该有一个可以工作的 Qt 应用程序,但我没有。

我正在使用 VS2013 和 Qt 5.3。我有以下代码来启动我的服务器:

MyClass::MyClass (quint16 port, QObject *parent) : 
    QWebSocketServer("Press And Listen Server", QWebSocketServer::SecureMode, parent) {

    QSslConfiguration sslConfiguration;
    QFile certFile (QStringLiteral ("localhost.crt"));
    QFile keyFile (QStringLiteral ("localhost.key"));
    certFile.open (QIODevice::ReadOnly);
    keyFile.open (QIODevice::ReadOnly);
    QSslCertificate certificate (&certFile, QSsl::Pem);
    QSslKey sslKey (&keyFile, QSsl::Rsa, QSsl::Pem);
    certFile.close ();
    keyFile.close ();
    sslConfiguration.setPeerVerifyMode (QSslSocket::VerifyNone);
    sslConfiguration.setLocalCertificate (certificate);
    sslConfiguration.setPrivateKey (sslKey);
    sslConfiguration.setProtocol (QSsl::TlsV1SslV3);
    this->setSslConfiguration (sslConfiguration);

    if (!this->listen (QHostAddress::Any, port)) {
        throw ServerNotStartedException () ;
    }
    qDebug () << "Server listenning on: " << port ;
    connect (this, &QWebSocketServer::newConnection, this, &MyClass::onNewConnection);
    connect (this, &QWebSocketServer::closed, this, &MyClass::onClose);
    connect (this, &QWebSocketServer::sslErrors, this, &MyClass::onSslErrors);
}

我使用以下方法创建了证书文件:https ://developer.salesforce.com/blogs/developer-relations/2011/05/generating-valid-self-signed-certificates.html

在浏览器端,我只有:

var websock = websock = new WebSocket('wss://localhost:52132');

websock.onerror = function (error) {
    console.log('Press & Listen, WS Error: ' + error);
};

websock.onopen = function () {
    console.log('Open!');
};

不幸的是,每次我尝试时,都会收到以下 JS 消息:

WebSocket connection to 'wss://localhost:52132/' failed: Error in connection establishment: net::ERR_TIMED_OUT

至今:

  • QSslSocket::supportsSsl ()返回true
  • 我没有任何QSslSocket: cannot resolve XXX method消息
  • 加载 OpenSSL DLL,VS2013 输出以下消息:

    “MyProject.exe”(Win32):已加载“I:\Sources\VS2013\x64\Release\ssleay32.dll”。无法找到或打开 PDB 文件。“PressAndListenQt.exe”(Win32):已加载“I:\Sources\VS2013\x64\Release\libeay32.dll”。无法找到或打开 PDB 文件。`

我不知道如何找到问题所在,所以我愿意接受任何建议!

编辑:我尝试使用以下内容(而不是上面的链接)生成自签名证书:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes

现在我得到另一个错误:

WebSocket connection to 'wss://localhost:52132/' failed: WebSocket opening handshake was canceled
4

3 回答 3

3

根据你的问题陈述

  • OpenSSL 库似乎还可以
  • Qt 代码和 Html 代码可能没问题
  • 缺少安全服务器

Qt \Examples\Qt-5.x\websockets\sslechoserver 中有一个示例代码,还有一个带有 websocket html 代码的 html 文件。如果我们运行上面的示例并查看 web-socket 回复,它将给出错误代码 1006 Error Codes

我查看了发生的错误,我认为这可能是因为您没有在安全的网络服务器(非 https)上托管您的 html 代码。我建议您在网络服务器上托管您的 html 文件,并将其与您的证书映射以进行 https 安全浏览。

连接终止可能是由于不安全的套接字或证书不匹配。

浏览器控制台

WebSocket connection to 'wss://localhost:1234/' failed: Error in connection establishment: net::ERR_INSECURE_RESPONSE 

URL 请求的浏览器跟踪

t=11880 [st= 0] +REQUEST_ALIVE  [dt=17]
t=11880 [st= 0]    URL_REQUEST_DELEGATE  [dt=1]
t=11881 [st= 1]   +URL_REQUEST_START_JOB  [dt=16]
                   --> load_flags = 18 (BYPASS_CACHE | DISABLE_CACHE)
                   --> method = "GET"
                   --> priority = "LOWEST"
                   --> url = "wss://localhost:1234/"
t=11881 [st= 1]      URL_REQUEST_DELEGATE  [dt=0]
t=11881 [st= 1]      HTTP_CACHE_GET_BACKEND  [dt=0]
t=11881 [st= 1]     +HTTP_STREAM_REQUEST  [dt=15]
t=11881 [st= 1]        HTTP_STREAM_REQUEST_STARTED_JOB
                       --> source_dependency = 6025 (HTTP_STREAM_JOB)
t=11896 [st=16]        HTTP_STREAM_REQUEST_BOUND_TO_JOB
                       --> source_dependency = 6025 (HTTP_STREAM_JOB)
t=11896 [st=16]     -HTTP_STREAM_REQUEST
t=11896 [st=16]      URL_REQUEST_DELEGATE  [dt=1]
t=11897 [st=17]      CANCELLED
                     --> net_error = -501 (ERR_INSECURE_RESPONSE)
t=11897 [st=17]   -URL_REQUEST_START_JOB
                   --> net_error = -501 (ERR_INSECURE_RESPONSE)
t=11897 [st=17]    URL_REQUEST_DELEGATE  [dt=0]
t=11897 [st=17] -REQUEST_ALIVE

Http Stream 的浏览器跟踪

t=11881 [st= 0] +HTTP_STREAM_JOB  [dt=15]
                 --> alternative_service = "unknown :0"
                 --> original_url = "wss://localhost:1234/"
                 --> priority = "LOWEST"
                 --> source_dependency = 6024 (URL_REQUEST)
                 --> url = "wss://localhost:1234/"
t=11881 [st= 0]   +PROXY_SERVICE  [dt=0]
t=11881 [st= 0]      PROXY_SERVICE_RESOLVED_PROXY_LIST
                     --> pac_string = "DIRECT"
t=11881 [st= 0]      PROXY_SERVICE_DEPRIORITIZED_BAD_PROXIES
                     --> pac_string = "DIRECT"
t=11881 [st= 0]   -PROXY_SERVICE
t=11881 [st= 0]   +SOCKET_POOL  [dt=15]
t=11896 [st=15]      SOCKET_POOL_BOUND_TO_CONNECT_JOB
                     --> source_dependency = 6026 (CONNECT_JOB)
t=11896 [st=15]      SOCKET_POOL_BOUND_TO_SOCKET
                     --> source_dependency = 6029 (SOCKET)
t=11896 [st=15]   -SOCKET_POOL
                   --> net_error = -202 (ERR_CERT_AUTHORITY_INVALID)
t=11896 [st=15]    HTTP_STREAM_JOB_BOUND_TO_REQUEST
                   --> source_dependency = 6024 (URL_REQUEST)
t=11896 [st=15] -HTTP_STREAM_JOB
于 2017-02-23T19:49:14.030 回答
2

几天前我似乎也发生了同样的事情。我解决了将自签名证书信任到可以使用 MMC 控制台打开的证书管理单元的问题。将您的证书导入当前用户的个人文件夹和本地计算机文件夹,也将证书导入受信任的发布者文件夹。记得在测试后删除证书。

您也可以对教程 Qt\Examples\Qt-5.5\websockets\sslechoserver\ 的 localhost.cert 证书进行相同的操作,并查看 websockets 网页如何与教程提供的 wss 连接。

当来自网页的 websockets 无法连接并出现相同的错误时,这对我有用。

(对不起,我的英语很低:))

于 2016-02-09T14:42:29.837 回答
-1

尝试将 url 从wss://localhost:52132 修改https://http://。作为一个猜测wss://可能会被防火墙拒绝,并且服务器会因为是自定义协议而被拒绝。

于 2017-02-24T07:08:43.030 回答