• Throw a Foxtrot@lemmynsfw.com
    link
    fedilink
    English
    arrow-up
    1
    ·
    11 months ago

    How do you get certs for internal applications?

    I use caddy and it does everything for me, but my limited understanding is that the dns entry for which the certs are requested must point to the ip address at which caddy is listening. So if I have a DNS entry like internal.domain.com which resolves to 10.0.0.123 and caddy is listening on that address I can get a http connection, but not an https connection, because letsencrypt can’t verify that 10.0.0.123 is actually under my control.

    • Lem453@lemmy.ca
      link
      fedilink
      English
      arrow-up
      0
      ·
      edit-2
      11 months ago

      You are completely correct…for normal certs. Internal domains require a wild card cert with DNS challenge.

      This video explains how to set it up with traefik

      https://youtu.be/liV3c9m_OX8

      I’d bet caddy can do something similar.

      Basically you have:

      1. Seafile.domain.com -> has it’s own cert
      2. *.local.domain.com -> has its own cert but the * can be anything and the same cert can be used for anything in place of the star as many times as you want and therefore doesn’t need to be internet accessible to verify. That way vaultwarden.local.domain.com remains local only.
    • lemmyvore@feddit.nl
      link
      fedilink
      English
      arrow-up
      0
      ·
      11 months ago

      There is an alternate verification method using an API key to your DNS provider, if it’s a supported one. That method doesn’t need any IP to be assigned (doesn’t care if there are A/AAAA records or where they point because it can verify the domain directly).

      deSEC.io is a good example of a good, reputable and free DNS provider that additionally allows you to manage API keys. The catch is that they require you to enable DNSSEC (their mission is similar to Let’s Encrypt, but for DNS).

        • lemmyvore@feddit.nl
          link
          fedilink
          English
          arrow-up
          2
          ·
          11 months ago

          I see that you want to use the cert for intranet apps btw.

          What I did was get two LE wildcard certs, one for *.my.dom and one for *.local.my.dom. Both of them can be obtained and renewed with the API approach without any further care to what they actually point at.

          Also, by using wildcards, you don’t give away any of your subdomains. LE requests are public so if you get a cert for a specific subdomain everybody will know about it. local.my.dom will be known but since that’s only used on my LAN it doesn’t matter.

          Then what I do for externally exposed apps is to point my.dom to an IP (A record) and either make a wildcard CNAME for everything *.my.dom to my.dom, or explicit subdomain CNAME’s as needed, also to my.dom.

          This way you only have one record to update for the IP and everything else will pick it up. I prefer the second approach and I use a cryptic subdomain name (ie. don’t use jellyfin.my.dom) so I cut down on brute force guessing.

          The IP points at my router, which forwards 443 (or a different port of you prefer) to a reverse proxy that uses the *.my.dom LE cert. If whatever tries to access the port doesn’t provide the correct full domain name they get an error from the proxy.

          For the internal stuff I use dnsmasq which has a feature that will override all DNS resolves for anything ending with .local.my.dom to the LAN IP of the reverse proxy. Which uses the *.local.my.dom LE cert for these ones but otherwise works the same.