Qt OpenSSL 问题 - 在某些计算机上被阻止(?)

Posted

技术标签:

【中文标题】Qt OpenSSL 问题 - 在某些计算机上被阻止(?)【英文标题】:Qt OpenSSL problem - blocked (?) on some computers 【发布时间】:2011-05-09 19:07:36 【问题描述】:

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

有什么建议吗?

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

【问题讨论】:

如果您详细说明“不起作用”的含义,这将有所帮助。一个特定的错误会很有用。 https 未加载。当我向 SSL 页面发送请求时,它返回空白页面。我的错误,我没有解释“不起作用” 【参考方案1】:

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

安装Win32 OpenSSL 将使其工作。

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

【讨论】:

我使用 OpenSSL 构建 Qt。在我的 PC 上安装了更多功能 OpenSSL,但我的应用无法在其上运行。【参考方案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

【讨论】:

【参考方案3】:

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

我也遇到过这样的问题,使用这个功能为我解决了。

【讨论】:

以上是关于Qt OpenSSL 问题 - 在某些计算机上被阻止(?)的主要内容,如果未能解决你的问题,请参考以下文章

OSX - Qt 应用程序在接收系统事件 QEvent::FileOpen 时崩溃

解决QT编译Android程序不支持openssl问题

解决QT编译Android程序不支持openssl问题

在不同的计算机上运行 Qt 应用程序

使用 Qt 的程序在另一台计算机上执行时崩溃

Qt UDpsocket 在同一台计算机上工作,但不在同一网络上的两台计算机上工作