一、简介
ESP-TLS提供多种认证方式如:crt_bundle_attach、global_ca_store、CA证书等。
下面是esp_http_client.c文件中认证方式中其中三种的实现。
if (config->crt_bundle_attach != NULL) {
#ifdef CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
esp_transport_ssl_crt_bundle_attach(ssl, config->crt_bundle_attach);
#else //CONFIG_MBEDTLS_CERTIFICATE_BUNDLE
ESP_LOGE(TAG, "use_crt_bundle configured but not enabled in menuconfig: Please enable MBEDTLS_CERTIFICATE_BUNDLE option");
#endif
} else if (config->use_global_ca_store == true) {
esp_transport_ssl_enable_global_ca_store(ssl);
} else if (config->cert_pem) {
if (!config->cert_len) {
esp_transport_ssl_set_cert_data(ssl, config->cert_pem, strlen(config->cert_pem));
} else {
esp_transport_ssl_set_cert_data_der(ssl, config->cert_pem, config->cert_len);
}
}
二、具体说明
2.1 crt_bundle_attach
用 ESP x509证书包API提供的自定义x509根证书认证,需要通过menuconfig配置以下各项:
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE:自动构建并附加bundle。
CONFIG_MBEDTLS_DEFAULT_CERTIFICATE_BUNDLE:决定从完整的根列表中包含哪些证书。
CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH:指定要嵌入到包中的任何其他证书的路径。
2.2 global_ca_store。
可以一次性初始化和设置global_ca_store。
2.3 CA证书(pem或der格式)
具体实现在transport_ssl.c中
void esp_transport_ssl_set_cert_data(esp_transport_handle_t t, const char *data, int len)
{
GET_SSL_FROM_TRANSPORT_OR_RETURN(ssl, t);
ssl->cfg.cacert_pem_buf = (void *)data;
ssl->cfg.cacert_pem_bytes = len + 1;//(如果是PEM格式,则包括null终止符)
}
void esp_transport_ssl_set_cert_data_der(esp_transport_handle_t t, const char *data, int len)
{
GET_SSL_FROM_TRANSPORT_OR_RETURN(ssl, t);
ssl->cfg.cacert_buf = (void *)data;
ssl->cfg.cacert_bytes = len;
}
除上述三种方式外还有
psk_hint_key:预共享密钥认证
skip server verification:跳过认证
官方示例使用的是pem格式CA证书认证,证书文件为“工程\server_certs\ca_cert.pem”。