Getting a Let’s Encrypt Certificate Through DNS Challenge With Cloudflare
Hi!
A couple of days ago one of my subdomains' SSL certificates expired.
Instead of paying for a renewal, I decided to have a first look at getting a free certificate from the Let's Encrypt Certificate Authority.
The ideal way would have been to set up a mechanism that would allow for an automatic certificate renewal, so I would not have to do it myself every 3 months. That is the maximum amount of time Let's Encrypt's certificates are valid for. However, in this case this was more easily said than done. The service I intend to use the certificate with is running on a shared IP and listening on a non-standard HTTPS port because the standard ports for HTTP and HTTPS are already used for something else. This prevented me from utilizing all HTTP / HTTPS based challenges to verify the hostname ownership which is an essential part of the Let's Encrypt certificate signing process.
After some searching I found a great solution that would enable me to do a somewhat half-automated, half-manual approach:
lukas2511's dehydrated ACME client in conjunction with kappataumu's Let's Encrypt Cloudflare hook.
This Shell-based ACME client allows the user to get a Let's Encrypt certificate using the dns-01 challenge. That way, you only have to create a DNS record (containing a generated value) in order to verify your ownership of the hostname instead of uploading content to the webserver. The DNS record can be created and deleted automatically through the Cloudflare hook if that is what you are using for your DNS record management.
The instructions for both the ACME client as well as the hook are pretty straightforward, so I recommend reading those if you are interested in trying this approach.
These are the changes I made in the config file (just as an example):
- Set "http-01" as the CHALLENGETYPE (explanation below):
CHALLENGETYPE="http-01"
- Set "rsa" as the KEY_ALGO:
KEY_ALGO=rsa
- Add environment variables with config for the Cloudflare hook script at the end:
export CF_EMAIL='[email protected]' export CF_KEY='1234567890abcdef1234567890abcdef' export CF_DEBUG=true
When attempting to execute dehydrated for the first time, it asks you to accept the terms. You can do that by simply entering this command:
$ ./dehydrated --register --accept-terms
Now you might have wondered why I set the CHALLENGETYPE to "http-01" instead of "dns-01"? So that we could accept the terms without any problems; "dns-01" gave me the following error: "ERROR: Challenge type dns-01 needs a hook script for deployment... can not continue."
The command I used to generate the certificates specified the challenge type "dns-01" explicitly anyway:
$ ./dehydrated -c -d hostname.example.org -t dns-01 -k hooks/cloudflare/hook.py
The first challenge attempt failed for me, but the execution went on to retry and ultimately finished successfully.
Afterwards, you can find the certificate files in the subdirectory "certs/hostname.example.org/".
I installed and executed the software in a local Linux virtual machine without any problems and then copied the certificate files over to the destination server manually. Technically I could have just done this on the production system as well, but I did not feel like saving my Cloudflare API credentials on it. It will be interesting to see how annoying the steps are going to get after a couple of repetitions. Maybe in time some other solution will have come around.
Hopefully this was a helpful recommendation for you.
Thanks for reading!
New Old Blog URL
Hello and a Happy New Year 2012!
Yesterday evening and early today I decided to implement something that has been flying around in my head for quite some while. I enabled SSL for my website - including this blog! - and at the same time moved the blog back to its original URL: http://blog.plee.me/
Now, as some of you might know, that subdomain URL has always continued to work even though I switched the URL to the subdirectory one for a while. However, instead of invalidating one or the other, both will still work. If you visit a link pointing to http://www.plee.me/blog/... you will be redirected to the new subdomain one.
So, with SSL being enabled as well, you can also reach this blog via https://blog.plee.me/, which I would strongly advise you to use over the unencrypted one. It's quite unlikely that I will post highly sensitive content on here to justify SSL encryption, but hey, it's fancy, and who doesn't like fancy stuff, right? 🙂
In order to not get any warning due to untrusted certificates, however, I recommend (not only for my site's sake but for a number of other privately or non-commercially run websites throughout the whole web) you visit http://www.cacert.org/ and get the root certificates for your browser so that CAcert will be trusted as a Certificate Authority.
Alright, that's it for now. I think I will have some relevant stuff to write about in 2012, so stay tuned.
Don't hold your breath though 😛
Oh, and in case you haven't noticed, I have actually been active on Twitter again for the last half year or so, and I'm intending on keeping that trend. So swing by there if you like 🙂 The link/info is on my main website.
Thanks for reading and sorry for any inconvenience.