c++ Http 请求 SSL 错误
c++ Http request SSL error
好的,所以我正在研究这个 c++ 项目,我从一个网站读取,需要谷歌,以获得要显示给用户的答案,我正在使用这个链接中的代码调用网站第二个解决方案第二个解决方案作为我项目的基础。从谷歌的搜索结果中请求 xml 将不起作用,因为答案不在 xml 中,所以我做了一个谷歌自定义搜索,使用谷歌自定义搜索 API 输出到 json。我的问题是当请求网址时,链接到我的谷歌自定义搜索示例,其中 json 会从我的程序中给出 ssl 错误。如何解决此 SSL 问题?似乎我需要获取https而不是http,或者我需要代码来验证SSL证书。不知道如何做到这一点,因为我是 c++ 上的协议和网络等新手。
不能使用第三方库。
我提前为我的问题道歉,并在这个问题上是一个菜鸟。
给定的代码使用普通套接字,代码中没有提到SSL,因此它不适用于HTTPS或任何其他基于SSL的协议。为了连接到HTTPS网页,必须使用OpenSSL或任何其他为TCP套接字提供此层的库(除非您要自己处理加密,我对此表示怀疑)。下面是使用提升库的示例:
/*
Compile with
g++ -std=c++11 -lpthread -lboost_system -lssl -lcrypto -ogoog goog.cpp
*/
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
using std::cout;
using std::endl;
using std::vector;
using std::string;
using boost::asio::ip::tcp;
using boost::asio::ip::address;
using boost::asio::io_service;
using boost::asio::connect;
using boost::asio::buffer;
using boost::system::error_code;
using boost::system::system_error;
using boost::asio::ssl::context;
int main()
{
const char* PORT = "443";
const string HOST = "googleapis.com";
const string REQUEST = "GET https://www.googleapis.com/customsearch/v1?q=when%20is%20george%20washingtons%20birthdate&cx=014855184903748195002:umdboiolvoi&key=AIzaSyDxFosFrZlMpgdFeTsPWZfp925MbaBX49s HTTP/1.1rnrn";
try
{
io_service ios;
tcp::resolver resolver(ios);
tcp::resolver::query query(HOST, PORT);
tcp::resolver::iterator iterator = resolver.resolve(query);
context ctx(context::sslv23);
boost::asio::ssl::stream<tcp::socket> sock(ios, ctx);
sock.set_verify_mode(boost::asio::ssl::verify_none);
connect(sock.lowest_layer(), iterator);
sock.handshake(boost::asio::ssl::stream_base::client);
const int BUFLEN = 2048;
vector<char> buf(BUFLEN);
sock.write_some(boost::asio::buffer(REQUEST, REQUEST.size()));
while (true)
{
size_t len = sock.read_some(boost::asio::buffer(buf, BUFLEN));
cout << "main(): buf.data()=";
cout.write(buf.data(), len);
}
}
catch (system_error& exc)
{
cout << "main(): exc.what()=" << exc.what() << endl;
}
return EXIT_SUCCESS;
}
它通过SSL套接字连接到Google API(不执行证书验证),发送GET请求,获取页面并打印到标准输出。但是,它是在无限循环中完成的,因此由您来解析 JSON 答案并确定何时退出读取循环。
相关文章:
- 如何使用QWebEngineView忽略SSL证书错误
- CPPRestSdk给出错误SSL错误:WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- Qt 错误消息"qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed"
- 使用 Boost ASIO 和 SSL 时出现"Wrong Version Number"错误 (C++)
- CMAKE 目标链接打开 SSL 错误
- 尝试关闭 SSL 套接字时使用升压 asio 1.64 的分段错误 (SIGSEGV)
- 致命错误:openssl/ssl.h:没有这样的文件或目录
- Arduino ESP8266HTTPClient:握手失败(SSL 错误 40)
- QnetWorkAccessManager在ARCH上给出了SSL错误
- libgit2:git_clone() 失败并出现"failed to create ssl object"错误
- 为什么这C++ASIO,当执行HTTP / SSL请求时,BEAST服务器会进入错误状态
- Linux/QT-错误创建SSL上下文(错误:140A90C4 ..)
- vcpkg 安装失败,并显示"SSL 连接错误"
- 提升/ASIO/SSL 抛出"undefined reference"错误
- 鱿鱼:鱿鱼-3 的编译错误.由于 SSL 导致的头部
- c++ Http 请求 SSL 错误
- 运行使用gSOAP创建的web服务客户端时发生SSL错误
- 应用程序中C++ SSL 错误SSL_ERROR_SYSCALL
- 无法从QNetworkAccessManager访问Ssl错误列表