docs/en/api-reference/protocols/esp_https_server.rst
:link_to_translation:zh_CN:[中文]
This component is built on top of :doc:esp_http_server. The HTTPS server takes advantage of hook registration functions in the regular HTTP server to provide callback function for SSL session.
All documentation for :doc:esp_http_server applies also to a server you create this way.
The following APIs of :doc:esp_http_server should not be used with :doc:esp_https_server, as they are used internally to handle secure sessions and to maintain internal state:
"send", "receive" and "pending" callback registration functions - secure socket handling
httpd_sess_set_send_overridehttpd_sess_set_recv_overridehttpd_sess_set_pending_override"transport context" - both global and session
httpd_sess_get_transport_ctx - returns SSL used for the sessionhttpd_sess_set_transport_ctxhttpd_get_global_transport_ctx - returns the shared SSL contexthttpd_config::global_transport_ctxhttpd_config::global_transport_ctx_free_fnhttpd_config::open_fn - used to set up secure socketsEverything else can be used without limitations.
.. note:: APIs in the HTTPS server are not thread-safe. If thread safety is required, it is the responsibility of the application layer to ensure proper synchronization between multiple tasks.
Please see the example :example:protocols/https_server to learn how to set up a secure server.
Basically, all you need is to generate a certificate, embed it into the firmware, and pass the init struct into the start function after the certificate address and lengths are correctly configured in the init struct.
The server can be started with or without SSL by changing a flag in the init struct - :cpp:member:httpd_ssl_config::transport_mode. This could be used, e.g., for testing or in trusted environments where you prefer speed over security.
The initial session setup can take about two seconds, or more with slower clock speed or more verbose logging. Subsequent requests through the open secure socket are much faster (down to under 100 ms).
ESP HTTPS Server has various events for which a handler can be triggered by the :doc:../system/esp_event when the particular event occurs. The handler has to be registered using :cpp:func:esp_event_handler_register. This helps in event handling for ESP HTTPS Server.
:cpp:enum:esp_https_server_event_id_t has all the events which can happen for ESP HTTPS server.
Expected data type for different ESP HTTPS server events in event loop:
- HTTPS_SERVER_EVENT_ERROR : ``esp_https_server_last_error_t``
- HTTPS_SERVER_EVENT_START : ``NULL``
- HTTPS_SERVER_EVENT_ON_CONNECTED : ``NULL``
- HTTPS_SERVER_EVENT_ON_DATA : ``int``
- HTTPS_SERVER_EVENT_SENT_DATA : ``NULL``
- HTTPS_SERVER_EVENT_DISCONNECTED : ``NULL``
- HTTPS_SERVER_EVENT_STOP : ``NULL``
:example:protocols/https_server/simple demonstrates how to create an HTTPS server that returns a simple HTML page when visited.
:example:protocols/https_server/wss_server demonstrates how to create an SSL server with a simple WebSocket request handler that supports handling multiple clients, PING-PONG mechanism, and sending asynchronous messages to all clients.
The ESP HTTPS Server component provides an option to set the server certification selection hook. This feature allows you to configure and use a certificate selection callback during server handshake. The callback helps to select a certificate to present to the client based on the TLS extensions supplied in the client hello message, such as ALPN and SNI.
To enable this feature, please enable :ref:CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK in the ESP HTTPS Server menuconfig. Please note that the ESP-TLS option is only available when Mbedtls is used as the TLS stack for ESP-TLS (default behaviour).
When enabled, you can set the certificate selection callback using the :cpp:member:httpd_ssl_config::cert_select_cb member of the :cpp:type:httpd_ssl_config_t structure.
.. code-block:: c
int cert_selection_callback(mbedtls_ssl_context ssl) { / Code that the callback should execute */ return 0; }
httpd_ssl_config_t cfg = {
cert_select_cb = cert_section_callback,
};
.. include-build-file:: inc/esp_https_server.inc