The options I've considered so far:
- use a self-signed cert for each device and call it a day, but that doesn't protect against MITM attacks and if someone hacks into my Wifi they probably also have the tools to crack the self-signed cert stuff
- use a self-signed cert using a properly set-up internal CA and install the CA cert in all my browsers. This would protects against the MITM attacks, but is a total PITA to set-up on cell phones, tablets, multiple browsers on each machine, etc.
- use the fact that I have public DNS names for all devices and generate free SSL certs using Let's Encrypt. That solves the issues with the self-signed certs, but lands me in certificate expiration hell pretty soon, specially considering that LE plans to switch to 90 day cert expirations. It's also not something other people using my software can easily replicate.
- do not run any server on the esp8266, i.e., only use client connections. A good way to accomplish that is to use mqtt (over SSL) instead of https. That avoids the problem, but it means every esp8266 I deploy depends on some central mqtt server. Also, while that's actually something I'm planning to do, it doesn't solve the bootstrapping problem, stuff like having the esp8266 start out in AP mode so it can be configured to connect to the correct wifi network.
It there any other decent option I have overlooked? It seems that securing IoT devices is almost inherently impossible?