Let's Encrypt (beta) on rails

Oct 22, 2015

Let’s Encrypt is here to fix the web with free SSL certificates for everyone, and I hope they will gain a lot of tracing with this! slidr.io was choosen as a beta tester. And operates with a Let’s Encrypt certificate I want to share how I got through the challenges with my rails app hosted on Heroku and uploaded the certificate.

Setup

Follow the steps in the installation instructions.

Generating the certificate

./letsencrypt-auto --agree-dev-preview --server \
      https://acme-v01.api.letsencrypt.org/directory auth

The first question is if you’d like the standalone verification or the manual one. I’d go for the manual one as I’ve no access to the “server”.

The client will ask you for the domain(s) you want to have included in the certificate.

Next you will be presented with a challenge which looks basically like this:

Make sure your web server displays the following content at
http://slidr.io/.well-known/acme-challenge/<some hash> before continuing:

{"header": {"alg": "RS256", "jwk": {"e": "AQAB", "kty": "RSA", "n": "..."}}, "payload": "...", "signature": "..."}

Content-Type header MUST be set to application/jose+json.
[...]
Press ENTER to continue

headsup: the url is http, and as of now their client does not follow 30 redirects, also non to https :wink:*

Passing the challenge with rails

To pass this challenge I’ve to get my Rails app to respond, here’s the change set I’ve figured out working nicely for me:

# config/routes.rb
get '/.well-known/acme-challenge/:id' => 'welcome#letsencrypt'
# app/controllers/welcome_controller.rb
def letsencrypt
  response.headers["Content-Type"] = "application/jose+json"
  render body: '{"header": {"alg": "RS256", "jwk": {"e": "AQAB", "kty": "RSA", "n": "..."}}, "payload": "...", "signature": "..."}'
end

As I mentioned it will not follow redirects, so make sure you temporarily disable it.

# config/environments/production.rb
config.force_ssl = false

Uploading the certificate to Heroku ssl

After pressing Enter and waiting a few secs, I was presentes with the following message

IMPORTANT NOTES:
 - Congratulations! Your certificate has been saved at
   /etc/letsencrypt/live/slidr.io/cert.pem and will expire on
   2016-01-20. To obtain a new version of the certificate in the
   future, simply run Let's Encrypt again.

Now I had to upload the cert to Heroku:

sudo heroku certs:update /etc/letsencrypt/live/slidr.io/fullchain.pem /etc/letsencrypt/live/slidr.io/privkey.pem

headsup: it is important that you choose the fullchain.pem because otherwise some browsers might mark your site as untrusted.

That’s it already. I hope this little guide helps you too, or gave you some insights how the Let’s Encrypt process looks like.

I also want to say a huge THANK YOU to everyone involved with Let’s Encrypt it’s a great project involving a lots of efforts. You folks rock! <3