2015-12-21 3 views
1

Я пытаюсь получить содержимое сайта (json string) с помощью Qt framework (QNetworkRequest) поверх среды VS2010 C++. У меня нет проблем с чтением данных с HTTP-сайта, однако, когда я пытаюсь прочитать содержимое сайта HTTPS, мне не повезло. С другой стороны, браузер может «видеть» содержимое сайта. Я думаю, что это вопрос сертификатов, но я не совсем уверен. У меня есть доступ только к ca.pem (который я экспортировал) из firefox. Я использовал фиктивные файлы pem для cert.pem и key.pem, чтобы я не оставил пустой. К сожалению, я не могу получить эти файлы по-другому.Получить содержимое сайта HTTPS с помощью C++ QNetworkRequest

Я получаю код ошибки 99 с описанием «Закрытый ключ не сертифицирует открытый ключ, ошибка: 140A80B1: Подпрограммы SSL: SSL_CTX_check_private_key: сертификат не присвоен». Таким образом, это должна быть ошибка сертификата фиктивного ключа.

Однако я не могу перестать задаваться вопросом, как возможно, что браузер может «видеть» содержимое и через код, который я не могу? Можно ли найти работу?

Мой код выглядит следующим образом:

{ 
    QNetworkAccessManager *manager = new QNetworkAccessManager(); 
    QNetworkRequest request; 
    QNetworkReply *reply = NULL; 

    QSslConfiguration config = QSslConfiguration::defaultConfiguration(); 
    config.setProtocol(QSsl::AnyProtocol); 
    request.setSslConfiguration(config); 
    request.setUrl(QUrl("https://....")); 
    addSSl(&request); 
    request.setHeader(QNetworkRequest::ServerHeader, "application/json"); 

    reply = manager->get(request); 

    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); 
} 

void addSSL(QNetworkRequest *request) 
{ 
    QString cacert_path="../certificates/cacert.pem"; 
    QString cert_path="../certificates/cert.pem"; 
    QString key_path="../certificates/key.pem"; 

    QFile cacert_file(cacert_path); 

    QSslConfiguration SslConfiguration(QSslConfiguration::defaultConfiguration()); 

    QList<QSslCertificate> caList = SslConfiguration.caCertificates(); 
    QSslCertificate cacert_cert=QSslCertificate::fromPath(cacert_path,QSsl::Pem)[0]; 

    QSslCertificate cert_cert=QSslCertificate::fromPath(cert_path,QSsl::Pem)[0]; 

    caList.append(cacert_cert); 
    SslConfiguration.setCaCertificates(caList); 
    SslConfiguration.setLocalCertificate(cert_cert); 
    SslConfiguration.setProtocol(QSsl::AnyProtocol); 

    QFile key_file(key_path); 
    bool exists=key_file.exists(); 
    QDir d = QFileInfo(key_file).absoluteDir();  
    QString absolutepath=d.absolutePath(); 

    QDir myDir("certificates"); 
    QStringList filesList = myDir.entryList(QDir::Files); 

    key_file.open(QIODevice::ReadOnly); 
    QSslKey sslkey(&key_file,QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey); 
    key_file.close(); 

    SslConfiguration.setPrivateKey(sslkey); 
    request->setSslConfiguration(SslConfiguration); 
} 
+0

Информация об ошибке не указана в ответеFinished()? (check reply-> error() и reply-> errorString()) –

+0

Я получаю код ошибки 99 с описанием «Закрытый ключ не сертифицирует открытый ключ, ошибка: 140A80B1: Подпрограммы SSL: SSL_CTX_check_private_key: сертификат не присвоен». Таким образом, это должна быть ошибка сертификата фиктивного ключа. – roni

ответ

-1

Пожалуйста, скопируйте эти файлы .dll в папку приложения:

libeay32.dll ssleay32.dll

QT нуждается в них, чтобы работать с SSL.

+0

Я сделал это и до сих пор не могу прочитать содержание – roni