Let’s Encrypt SSL Zertifikate unter Ubuntu Linux 16.04 Server mittels nginx und webroot Plugin beziehen

Let’s Encrypt stellt kostenfreie SSL Zertifikate aus, welche von den gängigen Betriebssystemen und Browsern akzeptiert werden. Diese sind jeweils nur 90 Tage gültig und müssen daher regelmäßig erneuert werden. Damit dies nicht immer manuell geschehen muss gibt es Tools welche diesen Vorgang automatisieren. Das offizielle Tool dafür ist certbot. In diesem Beitrag beschreibe ich wie unter Ubuntu Linux 16.04 Server mit nginx, certbot und dem webroot Plugin Zertifikate für Webseiten angefragt und automatisch erneuert werden können.

Installation

In den offiziellen Paketquellen von Ubuntu Linux 16.04 ist nur eine veraltete Version von certbot verfügbar, welche einige von mir benutzten Features noch nicht unterstützt. Daher verwende ich die Version aus dem PPA (Personal Package Archive) des Cerbot Teams.

Falls noch nicht geschehen muss das Paket software-properties-common installiert werden, welches es erlaubt Fremde Paketquellen (PPAs) einzubinden.

$ sudo apt-get install software-properties-common

Nun kann das PPA hinzugefügt werden, welches mit einem Return bestätigt werden muss.

$ sudo add-apt-repository ppa:certbot/certbot
 This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s).
 More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpkl9by_v1/secring.gpg' created
gpg: keyring `/tmp/tmpkl9by_v1/pubring.gpg' created
gpg: requesting key 75BCA694 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpkl9by_v1/trustdb.gpg: trustdb created
gpg: key 75BCA694: public key "Launchpad PPA for certbot" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

Jetzt müssen noch die Paketquellen aktualisiert und der certbot installiert werden.

$ sudo apt-get update
$ sudo apt-get install certbot

Zertifikate beziehen

Da ich nginx verwende und das offizielle nginx Plugin zum Abfragen der Zertifikate noch Alpha-Status hat verwende ich lieber das webroot Plugin. Die Parameter zur Zertifikatsabfrage lege ich in einer Konfigurationsdatei im Ordner /etc/letsencrypt ab. Da die Anzahl der Zertifikate, welche pro Woche für eine Domain inkl. der Subdomains ausgestellt werden auf 20 limitiert ist habe ich mich dafür entschieden nur ein Zertifikat für alle (Sub)Domains einer Domain zu beantragen welche über nginx laufen. Die zugehörige Konfiguration speichere ich als com.example-nginx.conf ab.

  • authenticator definiert das zu verwendende Plugin zum Abfragen
  • webroot-path legt das Verzeichnis fest, über das die Authentifizierung gegenüber Let’s Encrypt stattfindet
  • domains ist eine durch Komma separierte Liste aller Domains für die das Zertifikat gültig sein soll
  • email gibt die E-Mail-Adresse an, die von Let’s Encrypt zur Kontaktaufnahme verwendet wird, falls es Probleme gibt
  • rsa-key-size legt die Länge der zu verwendeten RSA Schlüssel fest
  • agree-tos akzeptiert die Terms of Service von Let’s Encrypt
  • text legt fest, dass die Textversion von certbot verwendet werden soll
  • pre-hook und post-hook definiert die Skripte die vor bzw. nach dem anfragen neuer Zertifikate ausgeführt werden sollen
# Use the webroot plugin 
authenticator = webroot

# Use the following path for authentication
webroot-path = /var/www/letsencrypt

# Include all listed domains in the certificate
domains = example.com, www.example.com

# Register certs with the following email address
email = admin@example.com

# Use a 4096 bit RSA key
rsa-key-size = 4096

# Accept the terms of service
agree-tos = True

# Use CLI version
text = True

# Run the following script before renewing the certs
pre-hook = sudo /usr/local/sbin/letsencrypt/pre-hook.sh

# Run the following script after renewing the certs
post-hook = sudo /usr/local/sbin/letsencrypt/post-hook.sh

Das pre Hook Skript aktiviert einen Verweis auf das Verzeichnis /var/www/letsencrypt. Das post Hook Skript deaktiviert diesen wieder. So ist das Verzeichnis nur erreichbar, wenn es wirklich notwendig ist. Dazu wird ein leeres nginx Snippets benötigt. Der Inhalt wird von den Hooks angepasst.

$ sudo touch /etc/nginx/snippets/certbot-webroot.conf

Nun muss noch das Verzeichnis zum Ablegen der Validierungsdateien sowie die Hook Skripte erstellt werden. Das Verzeichnis kann einfach mit nachfolgendem Befehl erstellt werden.

$ sudo mkdir -p /var/www/letsencrypt

Das pre bzw. post Hook Skript speichere ich im Verzeichnis /usr/local/sbin/letsencrypt, welches angelegt werden muss bevor die beiden Skripte erstellt werden können.

$ sudo mkdir -p /usr/local/sbin/letsencrypt

Als pre Hook Skript verwende ich nachfolgendes.

#!/bin/bash
# Add content to the nginx snippet
echo 'location ^~ /.well-known/acme-challenge/ {' >> /etc/nginx/snippets/certbot-webroot.conf
echo '    default_type "text/plain";' >> /etc/nginx/snippets/certbot-webroot.conf
echo '    root         /var/www/letsencrypt;' >> /etc/nginx/snippets/certbot-webroot.conf
echo '    auth_basic off;' >> /etc/nginx/snippets/certbot-webroot.conf
echo '}' >> /etc/nginx/snippets/certbot-webroot.conf

# Load new nginx config
/bin/sh /etc/init.d/nginx reload

Als post Hook Skript verwende ich nachfolgendes.

#!/bin/bash
# Empty the nginx snippet
truncate -s 0 /etc/nginx/snippets/certbot-webroot.conf

# Reload configurations
/bin/sh /etc/init.d/nginx reload

Um einen Missbrauch zu verhindern sollten die beiden hook Skripte nur als root ausführbar sein und wie der darüberliegende Ordner dem Benutzer root gehören.

$ sudo chown root:root /usr/local/sbin/letsencrypt* -R
$ sudo chmod 700 /usr/local/sbin/letsencrypt/p*

Damit das Snippet auch verwendet wird muss es in den jeweiligen nginx Konfigurationen der Seiten (z.B. /etc/nginx/sites-enabled/com.example) eingebunden werden. Dies kann durch nachfolgende Zeile im server-Block geschehen.

	include snippets/certbot-webroot.conf;

Nachfolgend eine mögliche minimale nginx Webseiten Konfiguration zum Abfragen von Zertifikaten – Natürlich sollte das Verzeichnis, welches als root angegeben ist vorhanden sein.

server  {
        listen          80;
        listen          [xxx:xxx:xxx::42]:80;

        server_name     example.com;

        root    /var/www/com.example;

        index   index.html;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.php?$args;
        }

        # snippet for updating letsencrypt certificates
        include snippets/certbot-webroot.conf;
}

Die Konfiguration muss natürlich aktiviert werden.

$ sudo ln -s /etc/nginx/sites-available/com.example /etc/nginx/sites-enabled/

Nun sollte noch geprüft werden, ob die neue nginx Konfiguration Fehlerfrei ist

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Da dies der Fall ist kann die Konfiguration nun einfach neu geladen werden

$ sudo /etc/init.d/nginx reload
[ ok ] Reloading nginx configuration (via systemctl): nginx.service.

Abschließend können die SSL Zertifikate mit folgendem Befehl bezogen werden. Falls certbot das erste Mal ausgeführt wird, fragt er zuerst nach, ob man einen Newsletter abonnieren möchte. Anschließend werden die Zertifikate automatisch abgefragt.

$ sudo certbot certonly -c /etc/letsencrypt/com.example-nginx.conf
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N
Running pre-hook command: sudo /usr/local/sbin/letsencrypt/com.example-nginx.pre-hook.sh
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Using the webroot path /var/www/letsencrypt for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Running post-hook command: sudo /usr/local/sbin/letsencrypt/com.example-nginx.post-hook.sh

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-08-26. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Das SSL Zertifikat wurde nun als /etc/letsencrypt/live/example.com/fullchain.pem und der zugehörige private Schlüssel als /etc/letsencrypt/live/example.com/privkey.pem gespeichert. Beide können über diesen Pfad in der nginx Konfiguration referenziert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.