使用c++QNetworkRequest获取HTTPS站点内容

Get HTTPS site content using c++ QNetworkRequest

本文关键字:站点 HTTPS c++QNetworkRequest 获取 使用      更新时间:2023-10-16

我正试图通过VS2010 c++环境使用Qt框架(QNetworkRequest)来获取站点的内容(json字符串)。我从HTTP站点读取数据没有问题,但是当我尝试读取HTTPS站点的内容时,我运气不好。另一方面,浏览器可以"查看"网站内容。我认为这是一个证书的问题,但我不完全确定。我只能访问firefox中的ca.pem(我导出的)。我使用了cert.pem和key.pem的伪pem文件,这样我就不会留下空白。不幸的是,我无法通过其他方式获取这些文件。

我得到一个错误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);
}

请将这些.DLL复制到您的应用程序文件夹:

libeay32.dllssleay32.dll

QT需要这些来使用SSL。