14

WebSocket を介して Web ブラウザー (現在は Google Chrome) と通信する Qt アプリケーションに取り組んでいます。

安全なWebソケットを使用しようとするまで、すべてが正常に機能していました...

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

2

数日前に私に起こったことと同じようです。自己署名証明書を、MMC コンソールを使用して開くことができる証明書スナップインに信頼することを解決しました。証明書を現在のユーザーの個人用フォルダーとローカル コンピューター フォルダーの両方にインポートし、証明書を信頼された発行元フォルダーにもインポートします。テスト後に証明書を忘れずに削除してください。

チュートリアル Qt\Examples\Qt-5.5\websockets\sslechoserver\ の localhost.cert 証明書についても同じことができ、websockets Web ページがチュートリアルで提供される wss に接続する方法を確認できます。

これは、WebページからのWebSocketが同じエラーで接続に失敗したときに機能しました。

(すみません、私の英語は下手です :) )

于 2016-02-09T14:42:29.837 に答える