Qt OpenSSL проблема - заблокирован (?) На некоторых компьютерах - PullRequest
3 голосов
/ 09 мая 2011

Я пишу приложение, которое использует OpenSSL.Со вчерашнего дня все было в порядке.Я скомпилировал приложение и отправил своему другу.На его компьютере приложение может открыть https.Я открываю на другом компьютере, и это не работает.Таким образом, я дал это другому другу, и он не может открыть веб-сайты https.Я запутался и отдал другому парню, и на его компьютере мое приложение работает.Я не понимаю ситуацию.Предыдущие версии работали без ошибок.Но я запускал предыдущую версию, которая работала, и она тоже не работает.Я отключил все свои брандмауэры.Ничего не изменилось.

Есть предложения?

У нас у всех 7 х64.Я тестировал на XP HE, и он работает, Бо на 7 x64 не работает.На компьютере моего друга 7 x64 работает, но на XP он не работает.Операционная система IMO не имеет никакого значения.

Ответы [ 3 ]

2 голосов
/ 25 октября 2012

Попробуйте использовать метод QSslSocket::ignoreSslErrors().

У меня тоже были такие проблемы, и использование этой функции решило их для меня.

2 голосов
/ 09 декабря 2012

Если у вас все еще нет решения этой ошибки - я просто столкнулся с той же проблемой.Кажется, это проблема цепочки сертификатов CA на компьютере Windows.Подробности можно найти по адресу 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
2 голосов
/ 10 мая 2011

По умолчанию Qt не содержит реализацию OpenSSL, но использует библиотеки, уже установленные в систему.

Установка Win32 OpenSSL заставит его работать.

Другой вариант - собрать Qt с OpenSSL. Некоторая информация здесь .

...