Я пытаюсь получить содержимое сайта (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);
}
Информация об ошибке не указана в ответеFinished()? (check reply-> error() и reply-> errorString()) –
Я получаю код ошибки 99 с описанием «Закрытый ключ не сертифицирует открытый ключ, ошибка: 140A80B1: Подпрограммы SSL: SSL_CTX_check_private_key: сертификат не присвоен». Таким образом, это должна быть ошибка сертификата фиктивного ключа. – roni