11

SSL を使用する Web サービスに接続しようとしています。QNX IDE Momentics を使用して C++ で Blackberry 10 を使用しています。私がやろうとしている接続は次のとおりです。

URL:「https://movilapi....」

コード:

networkAccessManager = new QNetworkAccessManager(this);
    bool res = connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(requestFinished(QNetworkReply*)));

    Q_ASSERT(res);
    Q_UNUSED(res);

    QNetworkRequest request = QNetworkRequest(QUrl(url));
    request.setRawHeader("User-Agent", "bb-phone/20120910");
    request.setRawHeader("Content-Type", "application/json");
    request.setRawHeader("Content-Length", postDataSize);

    QSslConfiguration sslConfig = request.sslConfiguration();
    sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    sslConfig.setProtocol(QSsl::TlsV1);
    request.setSslConfiguration(sslConfig);

        networkAccessManager->post(request, outData);

どのサービスにアクセスしようとしても、常に同じエラーが発生します。応答は次のとおりです: SSL ハンドシェイクに失敗しました

Wireshark 情報:

Protocol Length Info
SSLv2    157    Client Hello
TLSv1    1202   Server Hello, Certificate, Server Hello Done
TLSv1    449    Client Key Exchange
TLSv1    60     Change Cipher Spec
TLSv1    91     Encrypted Handshake Message
TLSv1    97     Change Cipher Spec, Encrypted Handshake Message
TLSv1    605    Application Data
TLSv1    280    Application Data
TLSv1    277    Application Data
TLSv1    121    Application Data
TLSv1    92     Application Data
TLSv1    297    Application Data, Application Data, Application Data, Application Data
TLSv1    77     Encrypted Alert

暗号化アラートのコンテンツ タイプは 21 です

サーバーの暗号スイートは、クライアントのサポートされている暗号スイートのリストにあります。

次のライブラリを使用して接続を確立しています: QtNetwork/qnetworkreply.h

この新しい情報により、質問の質が向上することを願っています。

助けてください、私は何時間も探していましたが、成功しませんでした。

4

2 に答える 2

2

この特定の問題について何人かの RIM の個人に連絡を取ったところ、TLS/SSL サーバーが特定の拡張機能に対して不寛容であることがわかりました。そのため、次の Qt コードを使用して拡張機能の送信を無効にすると、https 経由で接続が成功しました。

QSslConfiguration cfg(request.sslConfiguration());
cfg.setSslOption(QSsl::SslOptionDisableSessionTickets, true);
request.setSslConfiguration(cfg);

Research In Motion のアプリケーション開発部門には、最終的に正しい道にたどり着くまで、この問題に注意を払い、尽力してくれたことに特に言及したいと思います。

以下は、誰かがこの必要性に直面している場合の接続コード全体です。

networkAccessManager = new QNetworkAccessManager(this);
bool res = connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(requestFinished(QNetworkReply*)));    
QNetworkRequest request = QNetworkRequest(QUrl(url));
request.setRawHeader("User-Agent", "BB_PHONE/20120926");
request.setRawHeader("Content-Type", "application/json");
request.setRawHeader("Content-Length", postDataSize);

QSslConfiguration sslConfig = request.sslConfiguration();
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setPeerVerifyDepth(1);
sslConfig.setProtocol(QSsl::TlsV1);
sslConfig.setSslOption(QSsl::SslOptionDisableSessionTickets, true);

request.setSslConfiguration(sslConfig);
networkAccessManager->post(request, outData);
于 2013-01-10T14:16:48.113 に答える
0

サーバーは TLS v.1 をサポートしていますか? おそらく、SSLv2-3 または TLS v1.1-1.2 用にのみ構成されている可能性があります。もう 1 つの考えられる方法は、クライアントとサーバーの暗号スイートによって共有されていないことです。Wireshark を実行すると、ハンドシェイク パケット交換が表示されます。そこでは、サポートされている暗号スイート、SSL/TLS バージョン、およびその他の情報を確認できます。

于 2012-12-10T10:57:02.093 に答える