https不校验证书实现及https接口实现

一、HTTPS 不校验证书模式的实现

文档要求 "HTTPS(采用不校验证书的模式)",在代码中是通过 HTTPS 客户端配置 实现的:

c

运行

复制代码
static void https_send_data(void)
{
    if(https_client != NULL) 
    {
        esp_http_client_close(https_client);
        esp_http_client_cleanup(https_client);
        https_client = NULL;
    }
    // 1. 配置HTTP客户端参数
    esp_http_client_config_t config = {
        .host =(char*)https_t.serverIP,
        .path = "/api/pushrealData",
        .method = HTTP_METHOD_POST,
        .transport_type = HTTP_TRANSPORT_OVER_SSL, // 启用 SSL/TLS 加密(HTTPS)
        .skip_cert_common_name_check = true,        // 跳过证书通用名(CN)验证
        // 未配置 .cert_pem,即不加载 CA 证书,不校验服务器证书
    };
    // 2. 初始化HTTP客户端
    https_client = esp_http_client_init(&config);
    // ...
}
  • 核心配置
    • transport_type = HTTP_TRANSPORT_OVER_SSL:启用 HTTPS 加密传输。
    • skip_cert_common_name_check = true:跳过对服务器证书的通用名字段验证。
    • 未配置 cert_pem:不加载任何 CA 根证书,完全不校验服务器证书,符合 "不校验证书的模式"。

二、/api/getinfo 接口的实现

文档要求 "支持通过 https GET 接口 URL: /api/getinfo 获取序列号、软件版本、硬件版本、刷新间隔",代码中通过 路由注册 + 处理函数 实现:

1. 路由注册

https_uri 数组中,定义了该接口的路由规则:

c

运行

复制代码
static const httpd_uri_t https_uri[] = {
    {.uri = "/api/getinfo", .method = HTTP_GET, .handler = info_handler},
    // ... 其他接口
};
  • uri = "/api/getinfo":接口路径。
  • method = HTTP_GET:仅接受 GET 请求。
  • handler = info_handler:请求到达时,调用 info_handler 函数处理。
2. 处理函数 info_handler

c

运行

复制代码
static esp_err_t info_handler(httpd_req_t *req)
{
    if(!ValBit(dev_data[0].state,dev_sta_bit_line))
    {
        UTIL_LOG_E(TAG,"HTTPS get data error,wait.......");
        return ESP_ERR_NOT_FOUND;
    }
    /*获取系统信息*/
    char sn[30] = {0};
    util_get_meter_sn(sn); // 获取设备序列号
    cJSON *root = cJSON_CreateObject();
    cJSON_AddItemToObject(root,"sn",cJSON_CreateString(sn)); // 添加序列号字段
    
    char temp[10] = {0};
    sprintf(temp,"%dV%d",SOFT_CODE,SOFT_VERSION);
    cJSON_AddItemToObject(root,"sw",cJSON_CreateString(temp)); // 添加软件版本
    
    cJSON_AddItemToObject(root,"hw",cJSON_CreateString("1.00.001")); // 添加硬件版本
    
    cJSON_AddItemToObject(root,"interval",cJSON_CreateNumber(conf_clt.port[0].gap_timer)); // 添加刷新间隔

    char *buf = cJSON_PrintUnformatted(root);
    cJSON_Delete(root);

    httpd_resp_sendstr(req, buf); // 发送 JSON 响应
    cJSON_free(buf);
    return ESP_OK;
}
  • 返回字段
    • sn:设备序列号(通过 util_get_meter_sn 获取)。
    • sw:软件版本(由 SOFT_CODESOFT_VERSION 拼接)。
    • hw:硬件版本(固定为 "1.00.001")。
    • interval:刷新间隔(从配置 conf_clt.port[0].gap_timer 读取)。

三、整体流程总结

  1. HTTPS 服务端 :通过 httpd_ssl_start 启动 HTTPS 服务器,加载证书和私钥,注册 /api/getinfo 等接口。
  2. HTTPS 客户端 :通过 https_send_data 初始化客户端,配置为 "不校验证书" 模式,可与服务端通信。
  3. 接口调用 :客户端发起 GET /api/getinfo 请求,服务端调用 info_handler 构造 JSON 响应,返回设备信息。
相关推荐
茶底世界之下1 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_916007471 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
2501_916008891 天前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915909061 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916008891 天前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
2501_915918412 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
终端安全笔记2 天前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
ToDesk_Daas2 天前
随时随地手搓app!手机远程 Vibe Coding 实操分享
智能手机·电脑·iphone
9765033352 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
黑化旺仔3 天前
【OC】KVO
macos·ios·objective-c·cocoa