我们知道要实现https,MQTT等协议时,要求通讯安全,客户端就必须实现tls证书的支持。
但是日常我们打开电脑和手机浏览器访问https网站,好像并不需要关注tls的问题?
答案是因为浏览器厂商已经帮助我们兼容好了,但当你要通过嵌入式IOT设备或者单片机实现https访问的时候,你就需要处理TLS证书的问题了。
因为ESP32的开源代码比较清晰简洁,所以我们今天的原理讲解,以ESP32为硬件平台,其他硬件也是类似的流程,你只要实现自己的过程,替换底层的socket等相关接口就可以实现类似的效果。
此文通过对关键代码的详细讲解,说明在ESP32下支持TLS证书的实现原理和过程。以此原理和过程作为参考,用户可以实现其他嵌入式硬件和单片机的TLS证书支持,因为ESP的证书的内容和代码都是源码可见的,在弄懂了后就可以很好的移植和仿制。
ESP32 HTTPS demo
官方的例子见 \examples\protocols\https_request,举例了三种支持TLS的方式:
https_get_request_using_crt_bundle();
https_get_request_using_cacert_buf();
https_get_request_using_global_ca_store();
第一种是cert bundle方式,这个是今天我们重点的讲解。后两种就是使用用户指定的证书的方式,代码非常简单,就不展开了,今天主要介绍 cert bundle的方式。把cert bundle方式弄清楚了,后面两种也就清楚了,因为后面两种就是cert bundle 方式的简化,简化了证书的反序列化,创建,匹配和校验过程。
cert bundle的优劣
-
优点:cert bundle的优势是不需要用户关注证书和手动下载证书,自动实现全球几球几乎所有TLS根证书的支持。
-
缺点:因为内置一百多种证书,所以占用空间要大写,经过实际代码测试验证,大概大了60K左右。
ESP32 x509 Certificate Bundle
esp32 针对TLS的场景提供了x509 Certificate Bundle的实现支持,其可以简单理解为 x509证书集合。
关于x509 Certificate Bundle的详细介绍,可以参看:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/protocols/esp_crt_bundle.html 。
原文已经讲的非常清楚了,我们就不赘述了,今天只重点关注源码细节。
ESP32 TLS实现过程简述
-
cert bundle 反序列化
-
创建空的证书