There’s been quite a bit of excitement surrounding Let’s Encrypt recently – a truly 100% free SSL issuer.
Last week I helped a friend of mine get his first Let’s Encrypt certificate generated and configured for his website. One of the things I found incredibly frustrating is that Let’s Encrypt does not have a package for Red Hat/CentOS/Fedora! Ignoring such a massive installed base seems monumentally dumb – so I hope that they correct it soon. Until they do, however, here’s a tutorial that should cover the gotchas for getting Let’s Encrypt to work on a CentOS 6 server with Apache 2.
The documentation (as of 06 Jan 2015) on the Let’s Encrypt website is in error in a few places (or, at least, not as correct as is could/should be). One big thing to note, for example, is that it says Python 2.6 is supported (the current release for RHEL/CentOS 6). If you run the certificate generator without the --debug
flag, though, it will error-out saying Python 2.6 is not supported.
While I used an existing CentOS 6 server, I’ll start this tutorial as I have many others – by telling you to go get a CentOS 6 server from Digital Ocean or Chunk Host.
Preliminaries
Login as root (or a sudo-privileged account – but root is easier), and install Apache, Python, and SSL – yum install httpd python mod_ssl
.
Also enable the EPEL repository: yum install epel-repository
(available from the CentOS Extras repository. I’m going to assume you are familiar with configuring Apache, and will only provide the relevant snippets from ssl.conf
herein.
Now that the basics are done, let’s move to Let’s Encrypt. I ran the tool in interactive mode (which is going to require ncurses to be available – it’s probably already installed on your system) – but you’ll want to add a crontab entry since Let’s Encrypt certs expire after 90 days, so I’ll compact the interactive session into a single command-line call at the end, which you’ll need to “know” how to do, since the --help
argument doesn’t do anything yet (that I could find).
Initial Certificate Creation
First, grab the latest Let’s Encrypt from GitHub:
git clone https://github.com/letsencrypt/letsencrypt &&Â cd letsencrypt
Stop Apache: service httpd stop
. Let’s Encrypt is going to try to bind to ports 80 and 443 to ensure you have control the domain.
Now run the letsencrypt-auto
tool – in debug mode so it’ll work with Python 2.6: ./letsencrypt-auto --debug certonly
.
Use certonly
because the plugins to automate installing for Apache and Nginx don’t work on CentOS yet.
Enter your domain name(s) for which you want to issue a certificate. If you accept incoming connections to www.domain.tld and domain.tld, be sure to put both in the list (likewise, if you have, say, blog.domain.tld that you want included).
Enter an administrative email address.
When the tool finishes, it’ll put symlinks in /etc/letsencrypt/live/domain.tld
, with the “actual” certs in /etc/letsencrypt/archive/domain.tld
. We’re going to reference the symlinks in /etc/letsencrypt/live/domain.tld
next.
Edit /etc/httpd/conf.d/ssl.conf
(I prefer emacs – but use whatever you prefer), and add the following lines in your VirtualHost directive:
SSLCertificateFile /etc/letsencrypt/live/domain.tld/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
Restart Apache – service httpd start
.
Try hitting https://domain.tld
in your web browser – and you should be golden!
Automating Renewal
Create a small shell script called renew-LE-certs.sh
somewhere you’ll remember where it is – like /root
:
service httpd stop
# add additional '-d' entries for more subdomains
/path/to/letsencrypt/letsencrypt-auto --debug --keep --agree-tos --rsa-key-size 2048 certonly -m ssladmin@domain.tld -d domain.tld -d www.domain.tld
service httpd start
For your crontab entry, do the following to setup monthly cert renewal:
@monthly /path/to/renew-LE-certs.sh