Rackspace DNS hook for letsencrypt.sh

March 31, 2016 ยท View on GitHub

This repository contains a hook for the letsencrypt.sh_ project that allows a user to obtain a certificate from the Let's Encrypt_ API via a DNS challenge. The hook will automatically create DNS records via the Rackspace DNS API_ and remove those records when the challenge process is complete.

Have more questions? Skip down to the FAQ section below.

.. _letsencrypt.sh: https://github.com/lukas2511/letsencrypt.sh .. _Let's Encrypt: https://letsencrypt.org/ .. _Rackspace DNS API: https://www.rackspace.com/en-us/cloud/dns

Usage

Installation


Start by cloning all of the files from GitHub:

.. code-block:: console

    $ git clone https://github.com/lukas2511/letsencrypt.sh.git
    $ cd letsencrypt.sh
    $ git clone https://github.com/major/letsencrypt-rackspace-hook.git hooks/rackspace

Install the python dependencies:

.. code-block:: console

    $ pip install -r hooks/rackspace/requirements.txt

Configuration

You will need some basic configuration to get started. First, create a config.sh in the base of the letsencrypt.sh repository directory:

.. code-block:: shell

# Use the staging API until we're sure everything is working
# (remove this later for production)
CA="https://acme-staging.api.letsencrypt.org/directory"

Now, we export the path to our pyrax credentials file as PYRAX_CREDS:

.. code-block:: shell

export PYRAX_CREDS="/home/myuser/.pyrax"

Not familiar with pyrax? Refer to the documentation on authentication to set up a pyrax configuration file with credentials.

Specify the domain you want to secure with an SSL certificate by creating a domains.txt in the same directory as config.sh:

.. code-block:: console

# Single domain
echo "example.com" > domains.txt

# Separate multiple domains with spaces
echo "example.com store.example.com backend.example.com" > domains.txt

Getting certificates


We have enough configuration to obtain SSL certificates.  Let's run the main
script, specify our hook, and request a DNS challenge:

.. code-block:: console

    $ ./letsencrypt.sh --challenge dns-01 --cron --hook 'hooks/rackspace/hook.py'
    # INFO: Using main config file /home/major/git/letsencrypt.sh/config.sh
    Processing example.com
     + Signing domains...
     + Generating private key...
     + Generating signing request...
     + Requesting challenge for example.com...
     + Rackspace hook executing: deploy_challenge
     + TXT record created: _acme-challenge.example.com => YJUYJ5DcGmQv2GsrWI4yQRZz8gIFb1pZklbRGneqON4
     + Waiting for challenge DNS record to appear on the DNS server (this usually takes 30-60 seconds)
     + Challenge record found!
     + Responding to challenge for example.com...
     + Rackspace hook executing: clean_challenge
     + Challenge is valid!
     + Requesting certificate...
     + Checking certificate...
     + Done!
     + Creating fullchain.pem...
     + Rackspace hook executing: deploy_cert
     + Certificate issued for example.com! Awesome!
     + Private key: /home/major/git/letsencrypt.sh/certs/example.com/privkey.pem
     + Certificate: /home/major/git/letsencrypt.sh/certs/example.com/cert.pem
     + Certificate w/chain: /home/major/git/letsencrypt.sh/certs/example.com/fullchain.pem
     + CA chain: /home/major/git/letsencrypt.sh/certs/example.com/chain.pem
     + Done!

Look in the ``certs`` directory to find your SSL certificates and keys!

.. _pyrax: https://github.com/rackspace/pyrax
.. _documentation on authentication: https://github.com/rackspace/pyrax/blob/master/docs/getting_started.md#set-up-authentication

FAQ
---

Can't I just buy SSL certificates like I always have?
  Absolutely!

  However, Let's Encrypt allows you to obtain certificates for
  free, which is a nice bonus.  The downside is that the certificates are only
  valid for 90 days.  If you have a mission critical system that doesn't handle
  SSL certificate updates well, you may want to purchase a longer duration
  traditional SSL certificate.

Why not use the normal HTTP challenge for Let's Encrypt?
  Some people find the HTTP challenge difficult, especially those that run many
  servers. A DNS record usually only needs to be created in one location and it
  is usually simple to add and remove.

  It can also be helpful when a website hasn't launched yet and the website is
  behind a firewall that limits HTTP access.

How do I get the certificates and keys deployed after I receive them?
  There are **plenty** of options.  I prefer to use Ansible to run
  letsencrypt.sh, pick up the files, and then copy them to remote locations.
  I also have the option to restart my web servers via Ansible once the new
  certificates are in place.

Your code sucks. What's your deal? I need this written in COBOL.
  Pull requests and issues are always welcomed on any of my repositories.

----

Enjoy! *-Major*