使用c++QNetworkRequest获取HTTPS站点内容
Get HTTPS site content using c++ QNetworkRequest
我正试图通过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.dll
ssleay32.dll
QT需要这些来使用SSL。
相关文章:
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- 获取加密的正文响应WinHttp HTTPS
- 如何通过NetHTTPClient在HTTPS中进行身份验证
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 如何在OSX上导航到用户输入站点?
- 如何在 Poco 中将工作 HTTP 代码转换为 HTTPS
- 如何将HTTPS流量重定向到本地主机:443上的代理?
- 简单的boost ASIO https不返回正文
- 如何使用野兽C++库从HTTP重定向到HTTPS?
- 递归ASMVisitor 和查找函数调用站点
- 我可以使用 Boost.Asio 和 Boost.Beast 库发出 HTTPS 请求或 HTTP/2 请求吗?
- 为什么当我从语句检查中删除"+ mod"时,以下程序给出错误的答案。问题链接:https://www.codechef.com/problems/FFC219B
- C++ boost::asio https 通过代理
- 如何在视觉工作室社区中设置竞争性编程站点等环境?
- NRVO不应该保证局部命名变量和调用站点变量采用相同的地址吗?
- 用libxml2中的https解析页面
- 在libcurl中恢复损坏的https下载
- 如何在 c++ 中在 http/https 端口上发送和接收数据?
- 通过HTTPS从POCO StreamCopier获取文件下载进度
- 使用c++QNetworkRequest获取HTTPS站点内容