Skip to content

Commit 55385ec

Browse files
committed
feat(websocket): Support DS peripheral for mutual TLS
1 parent 7dc87d2 commit 55385ec

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

components/esp_websocket_client/esp_websocket_client.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ typedef struct {
9393
size_t client_cert_len;
9494
const char *client_key;
9595
size_t client_key_len;
96+
#if CONFIG_ESP_TLS_USE_DS_PERIPHERAL
97+
void *client_ds_data;
98+
#endif
9699
bool use_global_ca_store;
97100
bool skip_cert_common_name_check;
98101
const char *cert_common_name;
@@ -531,6 +534,10 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand
531534
} else {
532535
esp_transport_ssl_set_client_key_data_der(ssl, client->config->client_key, client->config->client_key_len);
533536
}
537+
#if CONFIG_ESP_TLS_USE_DS_PERIPHERAL
538+
} else if (client->config->client_ds_data) {
539+
esp_transport_ssl_set_ds_data(ssl, client->config->client_ds_data);
540+
#endif
534541
}
535542
if (client->config->crt_bundle_attach) {
536543
#ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
@@ -696,6 +703,9 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
696703
client->config->client_cert_len = config->client_cert_len;
697704
client->config->client_key = config->client_key;
698705
client->config->client_key_len = config->client_key_len;
706+
#if CONFIG_ESP_TLS_USE_DS_PERIPHERAL
707+
client->config->client_ds_data = config->client_ds_data;
708+
#endif
699709
client->config->skip_cert_common_name_check = config->skip_cert_common_name_check;
700710
client->config->cert_common_name = config->cert_common_name;
701711
client->config->crt_bundle_attach = config->crt_bundle_attach;

components/esp_websocket_client/include/esp_websocket_client.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,13 @@ typedef struct {
108108
int buffer_size; /*!< Websocket buffer size */
109109
const char *cert_pem; /*!< Pointer to certificate data in PEM or DER format for server verify (with SSL), default is NULL, not required to verify the server. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in cert_len. */
110110
size_t cert_len; /*!< Length of the buffer pointed to by cert_pem. May be 0 for null-terminated pem */
111-
const char *client_cert; /*!< Pointer to certificate data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also `client_key` has to be provided. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_cert_len. */
111+
const char *client_cert; /*!< Pointer to certificate data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also `client_key` or `client_ds_data` (if supported) has to be provided. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_cert_len. */
112112
size_t client_cert_len; /*!< Length of the buffer pointed to by client_cert. May be 0 for null-terminated pem */
113-
const char *client_key; /*!< Pointer to private key data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also `client_cert` has to be provided. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_key_len */
113+
const char *client_key; /*!< Pointer to private key data in PEM or DER format for SSL mutual authentication, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also `client_cert` has to be provided and `client_ds_data` (if supported) gets ignored. PEM-format must have a terminating NULL-character. DER-format requires the length to be passed in client_key_len */
114114
size_t client_key_len; /*!< Length of the buffer pointed to by client_key_pem. May be 0 for null-terminated pem */
115+
#if CONFIG_ESP_TLS_USE_DS_PERIPHERAL
116+
void *client_ds_data; /*!< Pointer to the encrypted private key data for SSL mutual authentication using the DS peripheral, default is NULL, not required if mutual authentication is not needed. If it is not NULL, also `client_cert` has to be provided. It is ignored if `client_key` is provided */
117+
#endif
115118
esp_websocket_transport_t transport; /*!< Websocket transport type, see `esp_websocket_transport_t */
116119
const char *subprotocol; /*!< Websocket subprotocol */
117120
const char *user_agent; /*!< Websocket user-agent */

docs/esp_websocket_client/en/index.rst

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,34 @@ echo "" | openssl s_client -showcerts -connect websocket.org:443 | sed -n "1,/Ro
7373

7474
This command will extract the second certificate in the chain and save it as a pem-file.
7575

76+
Mutual TLS with DS Peripheral
77+
"""""""""""""""""""""""""""""
78+
79+
To leverage the Digital Signature (DS) peripheral on supported targets, use `esp_secure_cert_mgr <https://github.com/espressif/esp_secure_cert_mgr/>`_ to flash an encrypted client certificate. In your project, add the dependency: ::
80+
81+
idf.py add-dependency esp_secure_cert_mgr
82+
83+
Set ``client_cert`` and ``client_ds_data`` in the config struct:
84+
85+
.. code:: c
86+
87+
char *client_cert = NULL;
88+
uint32_t client_cert_len = 0;
89+
esp_err_t err = esp_secure_cert_get_device_cert(&client_cert, &client_cert_len);
90+
assert(err == ESP_OK);
91+
92+
esp_ds_data_ctx_t *ds_data = esp_secure_cert_get_ds_ctx();
93+
assert(ds_data != NULL);
94+
95+
esp_websocket_client_config_t config = {
96+
.uri = "wss://echo.websocket.org",
97+
.cert_pem = (const char *)websocket_org_pem_start,
98+
.client_cert = client_cert,
99+
.client_ds_data = ds_data,
100+
};
101+
102+
.. note:: ``client_cert`` provided by `esp_secure_cert_mgr` is a null-terminated PEM; so ``client_cert_len`` (DER format) should not be set.
103+
76104
Subprotocol
77105
^^^^^^^^^^^
78106

0 commit comments

Comments
 (0)