QNetworkRequest и конфигурация SSL по умолчанию - PullRequest
7 голосов
/ 10 сентября 2010

Я использую следующий фрагмент кода для выполнения HTTPS-запросов к серверу.

QNetworkRequest request;

//request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
request.setUrl(QUrl("https://www.someurl.com/"));

QNetworkReply *reply = manager->get(request);

Кажется, все работает с моим тестовым сервером, но я хотел бы знать, рекомендуется ли устанавливать defaultConfiguration (раскомментировать вторую строку) или сетевой API автоматически проверяет все defaultConfigurations при использовании SSL? И если он проверяет, это также делает, если я добавляю одну пользовательскую конфигурацию? Я имею в виду, нужно ли добавлять пользовательскую конфигурацию в список конфигурации по умолчанию? Например:

QSslConfiguration SslConfiguration(QSslConfiguration::defaultConfiguration());

QList<QSslCertificate> certificates = SslConfiguration.caCertificates();
certificates.append(QSslCertificate::fromData(certificate.toAscii(), QSsl::Pem));
SslConfiguration.setCaCertificates(certificates);

request.setSslConfiguration(SslConfiguration);

Редактировать: Я хотел бы добавить, что я работаю на платформе Symbian.

1 Ответ

6 голосов
/ 25 февраля 2011

Из документации
void QNetworkRequest::setSslConfiguration ( const QSslConfiguration & config ):

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

Вы можете проверить это утверждение, используя следующий код:

#include <QtGui/QApplication>
#include <QtCore/QDebug>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QSslConfiguration>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QNetworkAccessManager qnam;
    QNetworkRequest request;
    QNetworkReply* reply = qnam.get(request);

    qDebug() << "Default SSL configuration isNull: "
             << QSslConfiguration::defaultConfiguration().isNull();

    qDebug() << "SSL configuration used by QNAM isNull: "
             << reply->sslConfiguration().isNull();

    return app.exec();
}

Однако вы, похоже, путаете хранилище сертификатов корневого ЦС с конфигурацией SSL. Первый - только одна часть последнего (см. QList<QSslCertificate> QSslConfiguration::caCertificates () const). Если вы хотите убедиться, что ваши сертификаты корневого CA будут использоваться QNAM, вы можете воспользоваться тем, что QNAM использует QSslSocket для установления SSL-соединений и использования любого из следующих статических методов

void addDefaultCaCertificate ( const QSslCertificate & certificate )
bool addDefaultCaCertificates ( const QString & path, QSsl::EncodingFormat encoding = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString )
void addDefaultCaCertificates ( const QList<QSslCertificate> & certificates )
void setDefaultCaCertificates ( const QList<QSslCertificate> & certificates )

для установки сертификатов корневого ЦС, которые будут использоваться всеми SSL-соединениями, выполненными с использованием QSslSocket. Помните, что это глобальная настройка, которая влияет на все SSL-соединения, сделанные с использованием QSslSocket , а не только , сделанные с использованием QNAM. Нет API для установки этого только для определенного QNAM или для всех QNAM.

...