我正在尝试通过 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);
}