Show HN: Anchor Relay – A faster, easier way to get Let's Encrypt certificates
80 points
2 days ago
| 10 comments
| anchor.dev
| HN
From the cryptic terminal commands to the innumerable ways to shoot yourself in the foot, I always struggled to use TLS certificates. I love how much easier (and cheaper) Let's Encrypt made it to get certificates, but there are still plenty of things to struggle with.

That's why we built Relay: a free, browser-based tool that streamlines the ACME workflow, especially for tricky setups like homelabs. Relay acts as a secure intermediary between your ACME client and public certificate authorities like Let's Encrypt.

Some ways Relay provides a better experience:

  - really fast, streamlined certificates in minutes, with any ACME client
  - one-time upfront DNS delegation without inbound traffic or DNS credentials sprinkled everywhere
  - clear insights into the whole ACME process and renewal reminders
Try Relay now: https://anchor.dev/relay

Or read our blog post: https://anchor.dev/blog/lets-get-your-homelab-https-certifie...

Please give it a try (it only takes a couple minutes) and let me know what you think.

xmprt
2 days ago
[-]
I'm sure some people would find this useful but forgive me if I'm not ready to hand away my security to some unknown third party company. I don't know the first thing about CAs but Let's Encrypt really isn't that difficult to understand.
reply
weddpros
1 day ago
[-]
There's a scale beyond which the real challenge isn't issuing a certificate.

I see organisations with thousands of SSL certificates, and their struggle is real. Even reputable companies with huge teams have their certificates expire or served badly. Some serve expired certificates for years!

Plus, enterprise alternatives are extremely costly and rigid.

reply
tenuousemphasis
1 day ago
[-]
All the more reason to automate renewing of certificates.
reply
weddpros
1 day ago
[-]
Sure! yet automation only solves one problem (until it doesn't). Inventory and control/accountability is still needed at scale, and automation doesn't provide it.
reply
michaelt
2 days ago
[-]
I believe the intent here is:

* If you want an SSL certificate for, say, your printer

* And you don’t want to expose your printer’s port 80 to the public internet because you’re not stupid

* And you don’t want to put your DNS credentials onto your printer either, because again, you’re not stupid

* And you don’t want to pay for a certificate with a longer validity, because it’s a home printer, so you’re stitch with monthly cert rotations

* And you’ve embraced the reality that one can delegate SSL not just to CAs, but also to other third parties. Usually the likes of AWS & cloudflare - but why stop there?

Then this product is what you need!

reply
eternauta3k
2 days ago
[-]
Why not sign it yourself?
reply
woodruffw
2 days ago
[-]
Most people find the user experience of self-signed certificates much worse. The developer experience for local issuance isn't great, although mkcert does a really great job of smoothing the parts that can be smoothed[1].

[1]: https://github.com/FiloSottile/mkcert

reply
xp84
2 days ago
[-]
I started but haven't yet completed a project to use mkcert on a home server, and get all devices in the house to trust it as a CA for things such as printers and "internal tools" for my family such as Jellyfin, etc.

This would probably be easier if I was organized enough to use at least minimal MDM features on the family's devices though, so I haven't actually completed this project yet.

reply
weddpros
1 day ago
[-]
I think it's more a matter of scale. If you need SSL certificates for hundreds of appliances and you want to manage it, rather than hack it, that's the product you need.
reply
unsnap_biceps
2 days ago
[-]
Are there any printers that actually run acme where this is even a consideration?
reply
toast0
2 days ago
[-]
> * If you want an SSL certificate for, say, your printer

Ummmm why does my printer need a certificate?

reply
michaelt
2 days ago
[-]
Well yes, you've just hit on why this is a rather niche product.

You get a handful of somewhat questionable benefits. If for some reason your guests are visiting your printer's administration page, they won't have to click through a scary warning page. If someone is somehow sniffing all the traffic within your home network they won't be able to get your printer's administrative password.

But the main reason is some homelab enthusiasts are like bodybuilders at the gym - taking on tasks that seem Sisyphean to outsiders, for fun and to build their strength.

reply
themafia
1 day ago
[-]
> someone is somehow sniffing all the traffic within your home network they won't be able to get your printer's administrative password.

If they're persistently stealing traffic from my network then the printers administrative password is the least worrisome part.

> homelab enthusiasts are like bodybuilders at the gym

Self obsessed to the point of absurdity? There was a vulnerability a few years ago where you could embed an HP Printer Firmware update into the middle of a print file by taking advantage of some insane JCL commands. You can also embed JCL commands directly into a word document.

So these researchers created a word document that when printed updates your printers firmware with a hacked version allowing an advanced persistent threat to live inside your printer.

If your printer has no anti virus or no intrusion detection then putting an SSL certificate on there is entirely pointless.

reply
mholt
2 days ago
[-]
If you can't trust your network, you'll want encryption, regardless of devices on it.
reply
Palomides
2 days ago
[-]
if you can't trust your network, everything needs to be public internet level hardened anyway, so why not just directly use letsencrypt?
reply
Hackbraten
2 days ago
[-]
Because you don't want to expose your printer to the public Internet?
reply
fxtentacle
2 days ago
[-]
Then you need to make your network trustworthy first.
reply
Hackbraten
1 day ago
[-]
Why?
reply
derefr
2 days ago
[-]
If you're already thinking in the IPv6 mode of thought — where NAT / network-local addresses are irrelevant/obsolete, as long as there's a stateful firewall somewhere in front of your LAN devices, to treat all LAN devices as default-closed to incoming packets from outside the LAN's IPv6 network prefix...

...then (at least in theory!) there's no reason to not also give every one of those devices, with their public-routable IPv6 addresses, a stable public-rooted name — i.e. a DNS FQDN.

Mind you, none of the infrastructure to make this work exists.

For example, while DDNS exists, it really only exists to assign your gateway router itself a name — with the expectation being that you're using NAT, and then having your router port-forward any interior services to masquerade them as being services of the router.

A theoretical "DDNSv6", meanwhile, would instead expose your entire LAN as AAAA records under your DDNS suffix — much like how e.g. `tailscale share` exposes devices as device.yournetwork.ts.net. But using plain public-routed IPv6, rather than proprietary overlay routing.

The problem with this being that neither routers nor IoT devices have any way to assign DNS-like names to devices on your network. So where would these device names come from? (If it were me, I'd have the router observe mDNS announcements from these devices, and then suffix-replace `.local` in the mDNS name with the configured DDNS suffix to build AAAA records. But even then, some devices don't even do mDNS!)

And then, even if you do that, there's still nowhere for the TLS cert for your printer to live under this scheme. The printer itself has no concept of speaking TLS. (Why would it? It expects to only ever be local-segment routable, and for physical access to the network segment to be the sum total of its security mechanism.) To work around this, you'd need your gateway router to do L7 IPv6 routing (imagine if your router worked like Cloudflare DNS, where you could "orange cloud" your LAN devices) so that the router itself could 1. force itself as the default route for the device, even for LAN-to-LAN packets; and then 2. terminate the TLS connection if the device is being spoken to on port 443; but just act as a dumb passthrough otherwise.

reply
wredcoll
1 day ago
[-]
> The problem with this being that neither routers nor IoT devices have any way to assign DNS-like names to devices on your network

Is this because an ipv6 network doesn't have DHCP which has the side effect of telling the router the hostname of the machine asking for an IP?

reply
xp84
2 days ago
[-]
> still nowhere for the TLS cert for your printer to live under this scheme. The printer itself has no concept of speaking TLS. (Why would it? It expects to only ever be local-segment routable

one minor correction: modern (even 5-10 year old) printers do support TLS -- and they even try to push you to use it when they only have the built-in self-signed certificate. I've seen screens encouraging me to "click trust" etc. which seems idiotic to train anyone to do when the stakes of letting them admin the printer, over the LAN, over HTTP are so low. I'm so sure that a random rogue IOT device on my LAN is listening to that printer administration traffic, real high-value stuff there. Mind you that this is unrelated to whether a rogue LAN actor could sniff the actual documents being printed, since I don't think computers are typically set up to print with IPP over TLS, but use unencrypted protocols instead.

Anyway, with my HP printer, you can upload a cert and key file and that way it'll use a cert of your choice.

reply
geemus
2 days ago
[-]
We take security very seriously, which is why we designed Relay to work so that we never have to see your encryption keys. If Let's Encrypt is working well enough for you, that's great, but we've also heard about rough edges that people struggle with so we are trying to help them out.
reply
8organicbits
2 days ago
[-]
EFF has a great write up of the 'validation domain CNAME' approach this uses. It's great to see another entry in this space. As great as ACME is, there are still sharp edges we can improve with tricks like this.

https://www.eff.org/deeplinks/2018/02/technical-deep-dive-se...

reply
bobbob1921
2 days ago
[-]
I’ve never understood why there isn’t an easy way (ie that never expires) to use certificates or otherwise encrypt communications. I’m mainly referring to unique or internal use cases where the complications around certificates expiring has made it so that those communications end up unencrypted (SSL disabled). I guess what I’m saying is I’ve come across many cases where even bad encryption is better than plaintext, yet plaintext has to get used because of some element of certificates expiring needs renwal. Even bad or easy to crack encryption is better than plain text, yet I totally get why many scenarios end up using plain text (i’m talking in an internal or home lab type set up). I understand why public facing certificates need renewals
reply
weddpros
1 day ago
[-]
You could see expiring certificates as a chance to examine your security regularly: protocols and ciphers change, bugs are fixed, vulnerabilities are discovered and fixed.

Setup and forget is never good for security. From what I see with sslboard.com (I'm the founder), all hosts serving old expired certificates also have bad TLS versions and ciphers (RC4, DES) and vulnerabilities.

reply
cortesoft
2 days ago
[-]
> I guess what I’m saying is I’ve come across many cases where even bad encryption is better than plaintext

Where is this? Why would bad encryption be better than plaintext? I can't imagine a scenario where this is the case.

reply
8organicbits
2 days ago
[-]
Email is a great example of this. There's a bunch of complications like the 'to address' not matching the MX record, the MX record being served without DNSSEC, and a history of self-signed certificates. Unless you do something special you're likely transmitting email using TLS without validating the certificate.

This is strictly better than plaintext as a passive eavesdropper cannot listen in; an active attack is needed.

I wrote much more here: https://alexsci.com/blog/is-email-confidential-in-transit-ye...

reply
rainsford
1 day ago
[-]
I definitely agree it's strictly better than plaintext. But the counter argument is that introducing bad encryption makes it less likely you'll ever end up with good encryption because the perceived delta between good and bad encryption isn't enough to make people invest the effort compared to fixing the more obviously bad situation of just plaintext.

I honestly don't know if I fully buy that argument, but there's something to be said for the idea that the problem with "better than nothing" is that it presupposes "nothing" is what you'd otherwise end up with and the crummy solution is the best you're going to get. I think your blog post highlights this point. Encrypting email even without validating certificates is better than not doing the encryption at all, but is giving people the security blanket of "at least we're doing something" slowing down the process of taking that last step?

reply
teraflop
2 days ago
[-]
For an internal use case, nothing's stopping you from setting up your own CA, creating certificates that don't expire for 100 years, and telling your clients to trust them. It just takes a couple of OpenSSL commands which, while slightly complicated if you don't know what you're doing, can be easily automated with a shell script.

The browser limits on maximum certificate lifetimes only apply to the public web PKI, not to CAs that you configure yourself.

reply
dns_snek
2 days ago
[-]
You don't even need to remember any OpenSSL commands. I manage all of my home certificates using XCA GUI.

When creating your CA certificate you can hop into the Advanced tab and add the following line to constrain it to specific domains. This eliminates the risk of your likely-poorly-secured CA being abused to MITM all of your communications:

        nameConstraints=critical,permitted;DNS:.home.internal
This will only allow CA to sign certificates for *.home.internal. I think browser support for nameConstraints is pretty good these days but some clients might not be compatible and you can always install a CA certificate without this extension on devices that don't support it.
reply
op00to
1 day ago
[-]
Modern web browsers have started distrusting certificates over a certain lifetime. So annoying!
reply
codegeek
2 days ago
[-]
Or just use caddy as a reverse proxy [0]. This 1 line will do it all for you:

    myawesomedomain.com {
         respond "You just loaded this on https"
    }
[0] https://caddyserver.com
reply
Cockbrand
2 days ago
[-]
I only recently got into Caddy after using Apache and later Nginx for decades, and it's almost disappointing how little configuration it needs. It's very refreshing that we finally have a web server that needs hardly any fiddling with b/c it has nicely sane and comprehensive defaults.
reply
codegeek
2 days ago
[-]
Once you go Caddy, you never go back to Nginx and Apache.
reply
princevegeta89
1 day ago
[-]
+1 to Caddy - Another happy user that stopped caring about managing SSL certs 3 years ago.
reply
aeaa3
2 days ago
[-]
Does this means that you have the ability to

a) impersonate the identities of your users and b) decrypt the SSL traffic of your users

?

reply
benburkert
2 days ago
[-]
It does not.

Anchor never see sees your private keys for certificates.

We hold an ACME account key on your behalf with the CA, but we cannot use it impersonate your domain or decrypt traffic.

We have a more technical overview of how this works in our docs: https://anchor.dev/docs/public-certs/acme-relay

reply
hannob
2 days ago
[-]
> We hold an ACME account key on your behalf with the CA, but we cannot use it impersonate your domain or decrypt traffic.

That makes no sense whatsoever. If you have an ACME account key for my domain, of course you can use it to impersonate my domain. You just need to create another certificate. (Which I could detect, but if I know how to do that, I'm probably not going to need your service anyway.)

reply
masfuerte
2 days ago
[-]
If users delegate their DNS to you, what's stopping you issuing a certificate to yourself for their site?
reply
benburkert
2 days ago
[-]
We theoretically could, but those certificates would show up in CT logs. (For quick & easy monitoring, you can get an RSS feed for your domain on https://crt.sh/, but it's not the most reliable service.) It would be a reputation killer if we did that, just like it would be for your DNS provider or ISP.
reply
masfuerte
2 days ago
[-]
Right, but if you want people to trust you, you need to be open about what people are trusting you with. Your original answer seemed obfuscatory.
reply
benburkert
2 days ago
[-]
Sorry, not trying to obfuscate anything, hopefully this clarifies: users trust us to hold their ACME account key and we only ask for DNS records prefixed with `_acme-challenge.` to be CNAME delegated.

With this we could issue or revoke a new certificate, but we couldn't impersonate them because we don't control the rest of their DNS.

reply
dogleash
2 days ago
[-]
> we couldn't impersonate them because we don't control the rest of their DNS.

If that were true, nobody would need signed certificates in the first place.

reply
nbadg
2 days ago
[-]
Certificate transparency logs are likely the only realistic way, but you could make the same argument against your DNS provider. Trust has to start somewhere.

Whether or not something like this makes sense to you is probably a question of your personal threat model.

reply
weddpros
1 day ago
[-]
Seeing how people are worried about third parties issuing certificates, I encourage using a tool to monitor CT Logs. It really makes the fog of war disappear around your certificates.

https://crt.sh for point in time checks, https://sslboard.com for comprehensive oversight (disclosure: I'm the founder)

reply
nodesocket
2 days ago
[-]
I'm a bit confused the benefits? Caddy already makes Let's encrypt incredibly easy. I use the CloudFlare DNS provider, so don't even need to expose port 80 for http verification.
reply
cortesoft
2 days ago
[-]
I am pretty sure the main purpose is for people who use a DNS provider that does not have integrated support with certbot or cert-manager (basically this is a hosted acme dns (https://github.com/joohoi/acme-dns)
reply
bananapub
2 days ago
[-]
for everyone willing to put a tiny amount of effort in, you can just:

1. Install acme-dns somewhere

2. Point part of your domain to that

3. Use lego or caddy or whatever to get certs using dns-01

No need to pay some dude who can then forge certs for your domain.

reply
cortesoft
2 days ago
[-]
Every single SAAS product faces this criticism. You can always do it yourself, but if some people don't want to, I don't think it is bad to offer a hosted version.
reply
NoahZuniga
2 days ago
[-]
Your site doesn't work. The right arrow button is always disabled
reply
benburkert
2 days ago
[-]
sorry about that! mind sharing what domain name (or something similar that also doesn't work) & what browser you used?
reply
mano78
2 days ago
[-]
iOS safari
reply
traceroute66
2 days ago
[-]
Oh dear.

I'm sorry. But do you really need to re-invent the wheel yet again ?

Go to the Let's Encrypt website, there is a whole page of client implementations[1].

What makes yours better than, for example, `lego` or `caddy` or `step` ?

All of which are easy to use, come with sensible defaults and do not provide you with "innumerable ways to shoot yourself in the foot".

And for people who really can't use Let's Encrypt because "its difficult", there are still all the old-school, well-established, commercial CA's out there who will hold your hand in return for a few dollars.

[1] https://letsencrypt.org/docs/client-options/

reply
cortesoft
2 days ago
[-]
I haven't fully looked into it, but it seems to me that this is basically a hosted version of Acme-dns (https://github.com/joohoi/acme-dns)

The point of acme-dns is for people who 1) need to use DNS validation because they don't have an externally accessible web server or need a wildcard cert and 2) either use DNS providers that don't provide API support or whose API support has not been integrated into their tool of choice like cert-manager or certbot.

I have had to use ACME-DNS for that reason, and I don't think it is a horrible business to try to offer that as a service. I don't think I would use it (since acme-dns isn't that hard to set up and I am familiar with it), but I could imagine other people might want to.

reply
benburkert
2 days ago
[-]
We don't think of it as reinventing the wheel since it works with all existing RFC compliant ACME clients without needing a plugin. You can use lego, caddy, certbot, cert-manager, or whichever ACME client you prefer.

ACME is great and it's certainly an improvement over the legacy CA alternatives. But there's also some rough edges that we think can be streamlined.

reply
natewww
1 day ago
[-]
cool idea
reply