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 问题 - 在某些计算机上被阻止(?)的主要内容,如果未能解决你的问题,请参考以下文章