3

我编写了一个使用 OpenSSL 的应用程序 i qt。一切都很好,从昨天开始。我编译了应用程序并发送给我的朋友。在他的计算机应用程序上可以打开 https。我在其他电脑上打开,它不起作用。所以我把它给了其他朋友,他无法打开 https 网站。我很困惑,给了其他人,在他的电脑上我的应用程序正在运行。我不明白情况。以前的版本没有错误。但是我运行了以前的版本,它有效,但它也不起作用。我关闭了所有的防火墙。没有改变。

有什么建议么?

我们都有 7 x64。我在 XP HE 上进行了测试,它可以工作,但在 7 x64 上的 bou 不起作用。在我朋友的电脑上 7 x64 可以工作,但在 XP HE 上不行。IMO操作系统没有任何意思。

4

3 回答 3

2

尝试使用QSslSocket::ignoreSslErrors()方法。

我也有这样的问题,使用这个功能为我解决了这些问题。

于 2012-10-25T11:43:50.657 回答
2

默认情况下,Qt 不包含 OpenSSL 的实现,但使用已安装到系统中的库。

安装Win32 OpenSSL将使其工作。

另一种选择是使用 OpenSSL 构建 Qt。这里有一些信息。

于 2011-05-09T20:49:54.327 回答
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 回答