3

OpenSSL を使用するアプリ i qt を作成します。昨日から、大丈夫でした。アプリをコンパイルして友達に送りました。彼のコンピューター アプリケーションで https を開くことができます。他のコンピュータで開いたのですが、うまくいきません。だから私はそれを他の友人に渡しました、そして彼はhttpsウェブサイトを開くことができません. 私は混乱して他の人に与えました.彼のコンピューターで私のアプリは動作しています. 状況がわかりません。以前のバージョンはバグなしで動作しました。しかし、動作する以前のバージョンを実行しましたが、動作しません。すべてのファイアウォールをオフにしました。何も変わっていません。

助言がありますか?

私たちは皆、7 x64 を持っています。XP HE でテストしたところ動作しますが、7 x64 の bou は動作しません。私の友人のコンピューターでは 7 x64 は動作しますが、XP では HE は動作しません。IMO オペレーティング システムには意味がありません。

4

3 に答える 3

2

エラーの解決策がまだない場合は、同じ問題に遭遇しました。Windows コンピューターの CA 証明書チェーンに問題があるようです。詳細はhttps://bugreports.qt-project.org/browse/QTBUG-20012にあります。

アプリケーションでエラーが発生しないように ca チェーンを修正する小さなクラスもあります。

#ifndef OPENSSLFIX_H
#define OPENSSLFIX_H

#include <QSslConfiguration>

/* this class fixes a problem with qt/openssl and expired ca certificates.
 * the idea is taken from https://bugreports.qt-project.org/browse/QTBUG-20012
 * which describes the problem and the workaround further. the workaround is
 * scheduled for qt5, but will not be introduced into qt4.x.
 *
 * to use this fix just call it in main() before doing any network related 
 * stuff
 *
 * OpenSslFix::fixCaCertificates();
 *
 * it will go through the certificates and remove invalid certs from the chain,
 * thus avoiding the error to arise.
 */
class OpenSslFix {
public:
    static void fixCaCertificates()
    {
        QSslConfiguration config(QSslConfiguration::defaultConfiguration());
        QList<QSslCertificate> in(config.caCertificates());
        QList<QSslCertificate> out;

        for (int i=0, size=in.size(); i<size; ++i) {
            const QSslCertificate &c(in[i]);
            if (c.isValid()) {
                /* not expired -> add */
                out << c;
                continue;
            }

            /* check if the cert is already present in the output */
            bool found = false;
            for (int j=0, size=out.size(); j<size; ++j) {
                if (isCertificateSameName(c, out[j])) {
                    /* already present... */
                    found = true;
                    break;
                }
            }

            if (!found)
                out << c;
        }

        /* now set the new list as the default */
        config.setCaCertificates(out);
        QSslConfiguration::setDefaultConfiguration(config);
    }

private:
    static inline bool isCertificateSameName(const QSslCertificate &cert1, 
                                             const QSslCertificate &cert2)
    {
        return cert1.subjectInfo(QSslCertificate::Organization) ==
                cert2.subjectInfo(QSslCertificate::Organization) &&
                cert1.subjectInfo(QSslCertificate::CommonName) ==
                cert2.subjectInfo(QSslCertificate::CommonName) &&
                cert1.subjectInfo(QSslCertificate::LocalityName) ==
                cert2.subjectInfo(QSslCertificate::LocalityName) &&
                cert1.subjectInfo(QSslCertificate::OrganizationalUnitName) ==
                cert2.subjectInfo(QSslCertificate::OrganizationalUnitName) &&
                cert1.subjectInfo(QSslCertificate::StateOrProvinceName) ==
                cert2.subjectInfo(QSslCertificate::StateOrProvinceName) &&
                cert1.subjectInfo(QSslCertificate::CountryName) ==
                cert2.subjectInfo(QSslCertificate::CountryName);
    }
};

#endif // OPENSSLFIX_H
于 2012-12-09T00:38:33.070 に答える
2

デフォルトでは、Qt には OpenSSL の実装は含まれていませんが、システムに既にインストールされているライブラリを使用します。

Win32 OpenSSLをインストールすると動作します。

もう 1 つのオプションは、OpenSSL を使用して Qt をビルドすることです。ここにいくつかの情報があります。

于 2011-05-09T20:49:54.327 に答える
2

QSslSocket::ignoreSslErrors()メソッドを使用してみてください。

私もそのような問題を抱えていましたが、この機能を使用すると解決しました。

于 2012-10-25T11:43:50.657 に答える