You never need to expose a webserver to the public internet to use letsencrypt to get a valid SSL certificate, even if IP is in the private RFC range (192.168.x.x, 10.x.x.x, etc etc).
Every single webapp I run internally has a two line automated Caddy/letsencrypt auto configuration, that just works.
To suggest it is way too difficult suggests you haven't tried recently, or are familiar with very old http-based DNS authentication challenges. You do not need to use http-based challenges to use letsencrypt for a long time, although still supported.
> https://caddyserver.com/docs/automatic-https
> https://caddy.community/t/how-to-use-dns-provider-modules-in...
No port forwarding required, ever.
This feature also exists in plain ole letsencypt, their "dns-01" challenge support:
https://letsencrypt.org/docs/challenge-types/#dns-01-challen...
The list of DNS providers who support this is massive now too:
https://community.letsencrypt.org/t/dns-providers-who-easily...
It is now so absurdly easy to do, all my personal projects just have valid SSL by default now, even on my internal LAN. All letsencrypt needs is proof of domain ownership- thanks to DNS TXT records, no one needs to host a website/port forward to accomplish that.