Let's Encrypt: How It Works
letsencrypt.org
letsencrypt.org
Things I wanted to know which were not immediately apparent:
Will it be broadly accepted from day one? Yes, apparently, though see the identrust issue below.
Will it generate a keypair but keep the private key on your server? Yes.
Will it work without having to babysit an interactive prompt? Yes.
Will it just let you generate key,csr,crt and do your own config changes? Yes.
Questions I still don't know the answer to:
Will it provide wildcard certs? No idea. I'd love it to be true as this is the part of current CA's which really irks me - the price gouging over something which costs them nothing more to provide. Can't see anything on the website about it.
How does it auto-renew, does it have to run all the time?
Why is the cert for identrustssl not trusted in Chrome or Safari? That doesn't inspire confidence : https://www.identrustssl.com/
Can every CA support issuing certs this way please? :)
With regard to your questions:
> Will it provide wildcard certs?
Not initially, but possibly in a future iteration.
Note that having an automatic CA addresses some of the use cases for wildcard certs. Namely, if you're using a wildcard cert just to avoid having to manage individual certs for foo-1.example.com through foo-N.example.com, you can just have them each automatically get a specific cert.
> How does it auto-renew, does it have to run all the time?
That will depend on the software running on the web server. The current "node-acme" and "lets-encrypt-preview" implementations in the Github repo are examples. Ultimately, in addition to these tools, it would be great to have ACME / LE support built into web server platforms, which are already running all the time.
> Why is the cert for identrustssl not trusted in Chrome or Safari? That doesn't inspire confidence : https://www.identrustssl.com/
I don't know what the story is with that site, but I believe the Let's Encrypt CA will be cross-signed under the same IdenTrust CA that issued the cert for https://letsencrypt.org/. So Let's Encrypt certificates should work wherever that site works (which includes Chrome and Safari, at least on my MacBook).
> Can every CA support issuing certs this way please? :)
I can't speak for other CAs, but we are definitely open to other CAs re-using technologies from Let's Encrypt to automate their operations. It would be even better for them to collaborate in developing the protocol. That's why we wrote ACME up using the IETF's document format, so that it can be developed in the IETF's open process with many stakeholders involved.
OK, good to know.
Ultimately, in addition to these tools, it would be great to have ACME / LE support built into web server platforms, which are already running all the time.
I see, thanks, hence the emphasis on protocol not product. Great idea, let's hope it takes off, it'd be really nice to be able to just add a config for ssl_on and let the server deal with the rest. I suppose it's early days for discussions with server providers?
I don't know what the story is with that site
It's weird how old and busted CA sites are, almost without exception, I guess I shouldn't be surprised that a place selling certs doesn't even use them properly, but as you point out, they've issued letsencrypt.org, and that works fine. Good to know.
So Let's Encrypt certificates should work wherever that site works
This would be a great line for your how it works, rather than browser-trusted, which could mean anything really.
Thanks again for this great idea, looking forward to trying it out.
Turns out they had the wrong certificate chain provisioned. Seems to be fixed now.
Is there any reason why a company would prefer a CA other than Let's Encrypt?
(Personally I don't care about any of those reasons - I just want my website to be SSL powered with an official cert and modern cipher configuration.)
If they can get their certificate into all of the browsers then it's possible they could achieve broad adoption for domain-verified certificates. There will still be a market for other validation types (organization validated and extended validation, for example) though.
IdenTrust will cross-sign Let's Encrypt root cert. I imagine they will keep it cross-signed, for backwards compatibility, once LE has their root cert in all the browsers.
I imagine a lot of shared hosting companies who currently resell SSL certs to their own customers will be switching to this next year.
I will certainly use them, and will only recommend them and nobody else. The only reason I'd ever look at one of the old CAs now, is for EV certs. But 99% of the time, people don't need an EV cert.
The only reason I would still buy 1 certificate is for wildcard support.
I've used StartSSL, but somehow messed up the process and can't issue a new cert unless I pay to revoke the current. Even then their free certs expire in a year.
The only other free cert I found was from Comodo, but it expires after 90 days.
So, I wouldn't exactly say the only reason to pay for a cert is for wildcard support.
So if I have apache running http://example.com on port 80 and I follow the instructions ($ lets-encrypt example.com)
Will Apache now be correctly serving encrypted traffic on port 443 with a cert for https://example.com ?
All you really need are three things:
* the letsencrypt command line tool that will do the API dance to request the certificate
* a file in your web site root with a ownership verification token or a DNS record with said token
* a configuration file snippet for your server
I'm sure all of this will be documented very well.
You can pin other releases for specific packages, though, and if this is well-designed it should have minimal other dependencies. Ideally it's simply requesting and installing a key.
Also, how trivial/hard will it be for a state agent to generate its own certificate-signing traffic and use the Let's Encrypt CA to sign arbitrary domains of their choosing?
Public key pinning would protect against that class of attacks: https://wiki.mozilla.org/SecurityEngineering/Public_Key_Pinn...
For me the differentiation in the browser presentation of EV against ordinary SSL doesn't provide much additional security. Most users don't notice the difference and even if they do, wouldn't remember which sites had an EV certificate, such that they would notice it changing back to non-EV
I've never used those, and I don't know how relevant these are for companies, though.
Doing this would prevent a point in time vulnerability in DNS (temporary mitm showing a different IP for the domain) or direct mitm of the connection to the webserver. Otherwise the attacker could get a signed cert for https://peacenik.org, and then present that to activists that it mitms.
https://github.com/letsencrypt/acme-spec/blob/master/draft-b...
I can also envision unscrupulous registrars pre-applying for LE certs for a fee, like $5.99 per month, and being very tardy and uncooperative about relinquishing control.
If something could "just" prove identity without worrying about MITM we would not need the whole RSA stuff.
The part about proving to Let's Encrypt is problematic for sites that do not already have TLS on the example.com domain. Any plain HTTP request that Let's Encrypt makes to example.com to validate that you've put up some content on the server is susceptible to a MITM attack. I guess that means for users setting up certs for the first time they can't just put some content up on example.com and need to use DNS or something else to prove ownership.
The MITM problem with requests to example.com doesn't exist if example.com is already set up for HTTPS, which is probably why the examples on the technical description show requests for https://example.com/8303. I was confused about that at first because Let's Encrypt is largely targeted towards people without any TLS encryption yet.
FYI, CAs do this already (HTTP validation), but an easy fix is to generate a self signed cert and pass the fingerprint of it to the CA.
Suppose I somehow get control of a machine on the same network as a server that doesn't use Let's Encrypt. I can probably ARP spoof it pretty easily. If it has a signed certificate from a different CA, I can't MITM it without people noticing. Or I couldn't, until now! Because I can now "control" the server's responses, I can easily get Let's Encrypt to authorize a new key pair giving my control over that domain. I can now generate valid certs for my MITM keys.
If the server were already using Let's Encrypt, I couldn't create a new controlling key pair. The "How It Works" doesn't talk about that, but search the RFC for "recovery token". But if the server isn't using Let's Encrypt, what would stop me from doing this?
Of course, I'm actually on the other end of it. To project myself, do I really have to at least register a controlling key pair with Let's Encrypt and any other browser-supported CAs that adopt this protocol?
The CA's I've looked at have these agreements. I'd like to avoid binding myself or the visitors to my website to any legal requirements from a third party.
Firefox: Mozilla added the certificate in NSS 3.11.9 on 2008-01-31, see http://www-archive.mozilla.org/projects/security/pki/nss/nss... and https://bugzilla.mozilla.org/show_bug.cgi?id=411299 So Firefox starting with 3.0 works
Chrome: When the first Chrome came out it used Mozilla NSS which already included the certificate. Now Chrome uses the OS key store: http://www.chromium.org/Home/chromium-security/root-ca-polic...
Microsoft: The certificate is trusted by default since at least IE8 (http://www.herongyang.com/PKI/HTTPS-IE-8-Trusted-Root-CA-Cer...) and Windows automatically updates the certificates, see http://technet.microsoft.com/en-us/library/cc751157.aspx
Apple: Since iOS 2 (2008-07-11) (http://support.apple.com/en-us/HT2185) and at least since OS X Mavericks (http://support.apple.com/en-us/HT203120), but probably way earlier.
Java: Yes: https://gist.github.com/saltlakeryan/8479238
> Obtain a browser-trusted certificate and set it up on your web server
From the "RFC" on github:
> In the background, the web server contacts the CA and uses ACME to request that a certificate be issued for the intended domain name(s).
> Once the CA is satisfied, the certificate is issued and the web server automatically downloads and installs it, potentially notifying the operator via e-mail, SMS, etc.
This really sounds like they are generating the key pair, not just signing it. I think (hope) that's not the case, but clarity on this issue is pretty important.
They both show who you are (Driver's License: your name, cert: hostname), what you look like (DL: photo of you, cert: the key's fingerprint) and provide proof that they are genuine (DL: difficult and illegal fake, cert: practically impossible to do the math to forge a signature).
Note that they mention certificate singing requests. If the CA generated the keys, it wouldn't also need a CSR. It could just generate and send you the public and private keys and the signed certificate for them. However, it does need some information about the keys it's signing. You provide that information in the form of a CSR.
https://github.com/letsencrypt/lets-encrypt-preview/blob/mas...
For a setup like this, you may still be better off getting a single wildcard certificate for "*.example.com", which (as far as we know currently), isn't possible through Let's Encrypt. But it's certainly possible to get these certificates through Let's Encrypt.
https://github.com/letsencrypt/node-acme/blob/master/lib/acm...
This isn't really a MITM attack.
Shouldn't this be "over the CAs DNS resolver"?
/edit
well I guess if the attacker has control over your dns server, ofcours, but another vector is to spoof as the CAs resolver when the CA does a lookup for your domain.
The ones i've used (godaddy, startssl, namecheap/ssls.com rapidssl/positivessl) all wanted email verification iirc.
EDIT: of course that's equivalent to verifying the MX. Never mind!
* DNS: you need to add a specific record to your DNS zone * File: you need to add a specific file to the root of a HTTP server listening on the domain name * Email: they send an email to admin@ on the domain
All three are pretty much ways to check that you are the person in control of the associated DNS.
You could argue it's even slightly better, since with this solution, DNS is the only attack surface, whereas with email verification a vulnerable mail or web server would be enough. That is, if DNS is their only supported verification mechanism (which I don't think is true.)
Still, this is a great idea...
You could have it run once a year via crontab.
I would like to keep the control of my .conf files.
Also, the current implementation only changes the SSLCertificateFile directive if you provide your own --key, --csr and already have an SSL vhost for the domain. (This one change is logged.)
(sorry to beat a dead horse, but it's burned me recently and I think people are flipping the https only switch without awareness or consideration. doesn't mean "don't switch", but be aware.)
Or, all you have to do is let this new piece of software run periodically on your secure server. What could possibly go wrong?
Automate it. Make it part of your maintenance scripts. Put it in a cron job. I think it will be a huge step forward.
I'm bothered that this runs periodically. Will it auto-update code? How secure is the auto-update process? Who can run an auto-update? Does it run as root? If so, why?
If it was a one-time manual run, that wouldn't be so bad. You can snapshot a system, run it, and see what it changed. When it gets to run on its own, that's harder to test.
It's not like "take this binary blob from us and run it as root on your machine", it's like "we have an open source project that would like to work with your upstream OS distributor on exactly the same terms as, and in exactly the same way as, the other tools that you're using on your server".
Edit: If you want to follow along with, audit, contribute to, help package, etc., our preview client, it is available at
https://github.com/letsencrypt/lets-encrypt-preview
We will also welcome people to create their own interoperable software, so if you don't want to run our client or any of its dependencies, or if it doesn't work well with your serving environment, you can create your own alternative. (Hosting providers or CDNs that want certs for sites they host, for example, could create their own tools to deploy them, instead of using our tools.)
In any practical security system you are always going to have to trust that certain components are doing what they say they're doing. Fortunately, Let's Encrypt is from a reputable group, and sponsored by organizations with good reputations (Mozilla, EFF, etc.), which is about as good as you can hope for.
Is it really? Does it not potentially provide a false sense of security?
It needs to run continously for revocation purposes but8
It needs to run continously for revocation purposes but you don't notice because it's integrated in your web server. This could be done in the same way.