ESP32 HTTPS客户端POST请求(跳过证书验证)

这篇具有很好参考价值的文章主要介绍了ESP32 HTTPS客户端POST请求(跳过证书验证)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ESP32-ESP-IDF-HTTPS客户端

本文例程为ESP32 HTTPS客户端POST请求
只有HTTPS请求部分,联网部分省略默。。。

参考文档

乐鑫ESP-IDF API参考文档

所用API

函数 esp_http_client_init

//启动HTTP链接必须先调用此函数,返回值为为一个结构体对象,也是其它接口的必要参数
//失败返回NULL
//函数参数为constesp_http_client_config_t结构体指针(此结构体用于配置HTTP/HTTPS相关参数)
esp_http_client_handle_t esp_http_client_init(constesp_http_client_config_t *config)

结构体 constesp_http_client_config_t

此结构体用于配置HTTP/HTTPS参数

// 结构体成员如下
typedef struct {
    const char                  *url;//HTTP/HTTPS的url地址
    const char                  *host;//域名或ip(此项可不填)
    int                         port;//请求的端口80或443(默认此项可不填)
    const char                  *username;//用户名用于HTTP身份验证(不用不填)
    const char                  *password;//密码用于HTTP身份验证(不用不填)
    esp_http_client_auth_type_t auth_type;//HTTP身份验证类型默认为HTTP_AUTH_TYPE_NONE即无身份验证(默认即可)
    const char                  *path;//HTTP路径默认为/(客户端无需此项)
    const char                  *query;//HTTP查询
    const char                  *cert_pem;//服务器SSL证书(作为HTTPS服务器时)
    size_t                      cert_len;//证书长度
    const char                  *client_cert_pem;//客户端SSL证书(作为客户端,服务器需要验证证书时)
    size_t                      client_cert_len;//证书长度
    const char                  *client_key_pem;//客户端证书密钥
    size_t                      client_key_len;//密钥长度
    const char                  *client_key_password;//密钥密码
    size_t                      client_key_password_len;//密码长度
    const char                  *user_agent;//要与 HTTP 请求一起发送的用户代理字符串
    esp_http_client_method_t    method;//请求模式默认为HTTP_METHOD_GET即GET方法可根据需要进行修改,也可以默认不填请求时直接调用接口
    int                         timeout_ms;//网络超时时间
    bool                        disable_auto_redirect;//禁用HTTP自动重定向
    int                         max_redirection_count;//最大重定向数,如果为零,则使用默认值
    int                         max_authorization_retries;//接收 HTTP 未授权状态代码时的最大连接重试次数,如果为零,则使用默认值。如果 -1 则禁用授权重试
    http_event_handle_cb        event_handler;//HTTP事件回调函数(重要)
    esp_http_client_transport_t transport_type;//HTTP传输类型使用HTTP时填HTTP_TRANSPORT_OVER_TCP,使用HTTPS时填HTTP_TRANSPORT_OVER_SSL
    int                         buffer_size;//HTTP接收缓冲区大小(一般默认即可)
    int                         buffer_size_tx;//HTTP传输缓冲区大小
    void                        *user_data;//HTTP user_data上下文
    bool                        is_async;//设置异步模式,目前仅支持 HTTPS
    bool                        use_global_ca_store;//
    bool                        skip_cert_common_name_check;//跳过服务器证书 CN 字段的任何验证(注意此处有坑)
    esp_err_t (*crt_bundle_attach)(void *conf);//指向esp_crt_bundle_attach的函数指针。允许使用证书捆绑包进行服务器验证,必须在menuconfig中启用
    bool                        keep_alive_enable;//启用保持活动状态超时
    int                         keep_alive_idle;//保持活动空闲时间。默认值为 5(秒)
    int                         keep_alive_interval;//保持活动间隔时间。默认值为 5(秒)
    int                         keep_alive_count;//保持活动状态数据包重试发送计数。默认值为 3 个计数
    struct ifreq                *if_name;//要通过的数据的接口的名称。使用默认界面而不设置
} esp_http_client_config_t;

设置HTTP/HTTPS请求方法

此接口可以手动设置HTTP请求方式(可以覆盖配置结构体的设置)

//client为esp_http_client_init函数返回的结构体对象
//method为需要设置的请求方式GET填HTTP_METHOD_GET,POST填HTTP_METHOD_POST,还有其它方式不一一列举了,可以去这个枚举类型里面看
//失败返回ESP_ERR_INVALID_ARG
esp_err_t esp_http_client_set_method(esp_http_client_handle_t client, esp_http_client_method_t method)

设置请求头(如果需要的话)

//client为esp_http_client_init函数返回的结构体对象
//key为键,valude为值,例如esp_http_client_set_header(client, "Content-Type", "application/json");
//失败返回ESP_FAIL
esp_err_t esp_http_client_set_header(esp_http_client_handle_t client, const char *key, const char *value)

设置请求内容

此处为POST请求

//client为esp_http_client_init函数返回的结构体对象
//data为传输的数据首地址
//len为数据长度
//失败返回ESP_FAIL
esp_err_t esp_http_client_set_post_field(esp_http_client_handle_t client, const char *data, int len)

发起HTTP/HTTPS请求

此接口默认以阻塞方式发起请求

//client为esp_http_client_init函数返回的结构体对象
//失败返回ESP_FAIL
esp_err_t esp_http_client_perform(esp_http_client_handle_t client)

关闭链接

此函数放在最后调用,功能与esp_http_client_init相反

//client为esp_http_client_init函数返回的结构体对象
//失败返回ESP_FAIL
esp_err_t esp_http_client_cleanup(esp_http_client_handle_t client)

例程

#include "esp_system.h"
#include "esp_tls.h"

#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "freertos/task.h"

static const char *TAG = "APP_HTTP";

#define MAX_HTTP_RECV_BUFFER 512
#define MAX_HTTP_OUTPUT_BUFFER 2048

static esp_err_t _http_event_handler(esp_http_client_event_t *evt)
{
    switch (evt->event_id)
    {
    case HTTP_EVENT_ERROR:
        //当执行过程中出现任何错误时,会发生此事件 
        ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
        break;
    case HTTP_EVENT_ON_CONNECTED:
        // 一旦 HTTP 连接到服务器,就不会执行任何数据交换
        break;
    case HTTP_EVENT_HEADER_SENT:
        // 将所有标头发送到服务器后发生此事件
        break;
    case HTTP_EVENT_ON_HEADER:
        // 在接收从服务器发送的每个标头时发生
        break;
    case HTTP_EVENT_ON_DATA:
        ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
        //在此处理HTTP请求返回的数据
        break;
    case HTTP_EVENT_ON_FINISH:
        // 完成 HTTP 会话时发生
        break;
    case HTTP_EVENT_DISCONNECTED:
        // 连接断开时发生此事件
        break;
    }
    return ESP_OK;
}

static void http_rest_with_url(void *post_data)
{
    esp_err_t err;
    esp_http_client_config_t config1 = {
        .url = "https://www.baidu.com",
        .transport_type = HTTP_TRANSPORT_OVER_SSL,
        .skip_cert_common_name_check = true,
        // .port = 443,
        .event_handler = _http_event_handler,
    };
    esp_http_client_handle_t client = esp_http_client_init(&config1);


    // POST请求
    esp_http_client_set_method(client, HTTP_METHOD_POST);
    esp_http_client_set_header(client, "Content-Type", "application/json");
    esp_http_client_set_post_field(client, post_data, strlen(post_data));
    err = esp_http_client_perform(client);
    if (err == ESP_OK)
    {
        ESP_LOGI(TAG, "Status = %d, content_length = %d", esp_http_client_get_status_code(client),
                 esp_http_client_get_content_length(client));
    }
    else
    {
        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
    }
    free(post_data);
    esp_http_client_cleanup(client);
}

填坑

ESP32做为客户端进行HTTPS请求时,如果不需要验证服务器证书也就是想跳过证书验证,
改constesp_http_client_config_t结构体中skip_cert_common_name_check成员是没有效果的。
他只会跳过检查证书的CN而不是CA,不会跳过整个证书验证。
所以如果想跳过证书则需要在menuconfig里面修改ESP-TLS选项,改为默认跳过服务器证书如下图
ESP32 HTTPS客户端POST请求(跳过证书验证)文章来源地址https://www.toymoban.com/news/detail-454823.html

到了这里,关于ESP32 HTTPS客户端POST请求(跳过证书验证)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32蓝牙实例-BLE服务器与客户端通信

    在本文中,我们将介绍如何使用低功耗蓝牙在两个 ESP32 开发板之间执行 BLE 服务器客户端通信。 换句话说,将介绍如何通过 BLE 在两个 ESP32 开发板之间交换数据。 服务器和客户端之间的通信将通过 BLE 进行,其中一个 ESP32 板充当 BLE 服务器并将传感器读数发送到 ESP32 客户端

    2024年02月09日
    浏览(53)
  • 手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

            本文将实现:         1、esp32与腾讯云物联网服务器通过mqtt协议通信         2、电脑和手机客户端通过mqtt与腾讯云相通信         3、腾讯云服务器内部消息转发,将手机、电脑发布的主题转发给esp32订阅,实现手机、电脑与esp32的远程通信。      

    2024年02月11日
    浏览(62)
  • 使用 Web-Socket 客户端在两个 ESP32 之间进行实时数据传输

    近年来, 基于Arduino和ESP32 的网络服务器项目变得非常流行,并且对各种应用都很有用。但是这种 Web 服务器的主要缺点之一是它的静态特性。意味着通过 HTTP 更新网页,您需要更新整个网页,然后才能更新任何数据。这个问题有很多解决方法,比如几秒钟后自动刷新网页等等

    2024年02月07日
    浏览(55)
  • STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯

    目录 1、简介 2、硬件连接 3、上位机源码 3.1 widget.h 3.2 widget.c  3.3 显示图  4、下位机源码 4.1 cubemax配置  4.2 keil源码 本文使用STM32F103C8T6单片机使用单片机通过ESP8266WIFI模块与QT设计的上位机进行通讯,ESP8266设置AP模式。实现DHT11传感器温湿度的显示与远程控制LED小灯的亮灭

    2024年02月06日
    浏览(55)
  • 【异常】客户端发起HTTPS请求报错,服务端返回400 Bad Request ,并且提示No required SSL certificate was sent

    HTTP响应码400表示客户端发送了一个无效的请求。这可能是由于请求中缺少必需的参数或格式不正确等原因导致的。服务器无法处理此请求并返回400响应码。如果您正在编写Web应用程序,建议在处理请求时检查请求的有效性,并在必要时返回400响应码以指示客户端请求无效。

    2024年02月11日
    浏览(54)
  • 发送https请求并跳过ssl证书验证

     平台服务调用https接口报错: org.springframework.web.client.ResourceAccessException: I/0 error on PoST request for ?\\\"https://XXXXX\\\": java.security.centp.CertificateException: No subject alternative names present; nested exception is javax.net.ssl..SSLHandshakeException: java.security.cert.CertificateException: No subject alternative namesspresent 第

    2024年02月16日
    浏览(47)
  • 线上 udp 客户端请求服务端客户端句柄泄漏问题

    本题分别从如下三个方面来分享: 问题描述 自定义连接池的编写 common_pool 的使用 线上有一个业务,某个通服务通知 udp 客户端通过向 udp 服务端(某个硬件设备)发送 udp 包来进行用户上线操作 当同时有大量的请求打到 udp 服务端的时候,udp 服务端的回包可能会在网络环境

    2024年02月09日
    浏览(66)
  • Http远程调用(feign客户端通过POST传递FORM格式数据)

    目录       feign实现http远程调用(正文)       解决方案: 在正式讲解HTTP远程调用时,我们先来了解一下缺省方法的定义。 写在前面: 缺省参数可传可不传,可以传多个但他们必须是相同的类型 每个方法中缺省参数只能定义一个,并且只能在参数的最后定义; 缺省参

    2023年04月08日
    浏览(43)
  • 【全】OpenSSL创建生成CA证书、服务器、客户端证书及密钥说明

    本文章对应的文档: 使用OpenSSL创建生成CA证书服务器客户端证书及密钥资源-CSDN文库 https://download.csdn.net/download/weixin_41885845/88746920 服务器需要CA证书、server证书、server私钥,客户端需要CA证。 服务器需要CA证书、server证书、server私钥,客户端需要CA证书,client证书、client私钥。

    2024年01月19日
    浏览(51)
  • Kubernetes客户端认证——基于CA证书的双向认证方式

    Kubernetes集群的访问权限控制由API Server负责,API Server的访问权限控制由身份验证(Authentication)、授权(Authorization)和准入控制(Admission control)三个步骤组成,这个三个步骤是按序进行的(详细介绍请参见《(转)使用kubectl访问Kubernetes集群时的身份验证和授权》)。 其中身份验证

    2023年04月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包