1、安装openssl
sudo apt update
sudo apt install build-essential libssl-dev libtool autoconf automake zlib1g-dev
2、编译安装libcurl
wget https://curl.se/download/curl-7.69.1.tar.gz
./configure --with-openssl --enable-shared --enable-static --prefix=/opt/curl-7.69.1/build
make -j4 && make install
3、从远端导出证书
openssl s_client -connect 192.168.8.1:443 </dev/null 2>/dev/null | openssl x509 > device.crt
4、CMakeLists.txt添加依赖:
target_link_libraries(Test libcurl.a crypto ssl)
5、实现HTTPS GET方法
#pragma once
#include "Config.h"
#include <string>
#include <curl/curl.h>
#include <functional>
namespace uniseas {
namespace tv {
class HttpUtils
{
public:
using Handler = std::function<void(const std::string&)>;
HttpUtils(const Config& conf, Handler&& handler);
~HttpUtils();
void DoHttpGet(const std::string& url);
static size_t WriteResponse(void* buffer, size_t size, size_t nmemb, void* lpVoid);
private:
const Config& m_conf;
std::string m_baseUrl;
Handler m_handler;
};
}
}
#include <fstream>
#include <iostream>
#include <thread>
#include "HttpUtils.h"
namespace uniseas {
namespace tv {
HttpUtils::HttpUtils(const Config& conf, Handler&& handler)
: m_conf(conf)
, m_handler(std::move(handler))
{
m_baseUrl = "https://";
m_baseUrl += m_conf.get_http_conn().ipAddress;
m_baseUrl += ":";
m_baseUrl += std::to_string(m_conf.get_http_conn().port);
m_baseUrl += "/";
std::cout << "m_baseUrl:" << m_baseUrl << std::endl;
}
HttpUtils::~HttpUtils()
{
}
// 下载openssl:sudo apt install build-essential libssl-dev libtool autoconf automake zlib1g-dev
// 导出证书: openssl s_client -connect 192.168.8.1:443 </dev/null 2>/dev/null | openssl x509 > device.crt
void HttpUtils::DoHttpGet(const std::string& url)
{
CURL *pCurlHandle = curl_easy_init();
curl_easy_setopt(pCurlHandle, CURLOPT_URL, url.c_str());
curl_easy_setopt(pCurlHandle, CURLOPT_WRITEFUNCTION, WriteResponse);
std::string responseHead;
curl_easy_setopt(pCurlHandle, CURLOPT_WRITEDATA, &responseHead);
curl_easy_setopt(pCurlHandle, CURLOPT_CAINFO, "./device.crt");
curl_easy_setopt(pCurlHandle, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(pCurlHandle, CURLOPT_SSL_VERIFYHOST, 2L);
// 调试日志打印
// curl_easy_setopt(pCurlHandle, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(pCurlHandle, CURLOPT_TIMEOUT, 10L);
CURLcode res = curl_easy_perform(pCurlHandle);
if (res != CURLE_OK) {
std::cerr << "Request failed: " << curl_easy_strerror(res) << std::endl;
} else {
long httpCode = 0;
curl_easy_getinfo(pCurlHandle, CURLINFO_RESPONSE_CODE, &httpCode);
std::cout << "HTTP Status: " << httpCode << " Response:" << responseHead << std::endl;
}
curl_easy_cleanup(pCurlHandle);
}
size_t HttpUtils::WriteResponse(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
std::string* str = static_cast<std::string *>(lpVoid);
if (NULL == str || NULL == buffer)
{
return -1;
}
char* pData = static_cast<char *>(buffer);
str->append(pData, size * nmemb);
return nmemb;
}
}
}