c++ Http 请求 SSL 错误

c++ Http request SSL error

本文关键字:错误 SSL 请求 Http c++      更新时间:2023-10-16

好的,所以我正在研究这个 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 答案并确定何时退出读取循环。