Meine Lets Encrypt Erfahrungen

Beitrag vom 04.12.2015

Lets Encrypt ist vor ein paar Tagen endlich in die öffentliche Beta gestartet. Ich habe den letsencrypt-auto Client direkt mal installiert und berichte hier von meinen Erfahrungen.

Ich beschreibe hierbei, wie ich Lets Encrypt auf einem Debian Jessie mit Nginx als Webserver nutze bzw einbinde.

Installation

Zu Anfang habe ich mir einene neuen Linux Benutzer angelegt, welcher sich in /home/certs befindet. Dort läuft dann die Installation durch einfaches klonen des entsprechenden Git Repository.

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Hier wird es dann ein wenig komisch. Der Client fragt das root Kennwort ab und fängt ohne jegliche Nachfrage an, Pakete zu installieren.

The following NEW packages will be installed:
  augeas-lenses binutils dh-python dialog gcc gcc-4.9 libasan1 libatomic1 libaugeas0 libc-dev-bin libc6-dev libcilkrts5 libexpat1-dev libffi-dev libgcc-4.9-dev
  libitm1 liblsan0 libmpdec2 libpython-dev libpython2.7 libpython2.7-dev libpython3-stdlib libpython3.4-minimal libpython3.4-stdlib libquadmath0 libssl-dev
  libtsan0 libubsan0 linux-libc-dev python-chardet-whl python-colorama-whl python-dev python-distlib-whl python-html5lib-whl python-pip-whl python-requests-whl
  python-setuptools-whl python-six-whl python-urllib3-whl python-virtualenv python2.7-dev python3 python3-minimal python3-pkg-resources python3-virtualenv
  python3.4 python3.4-minimal virtualenv zlib1g-dev

Glücklicherweise scheint das alles nicht so schlimm zu sein.

.well-known

Lets Encrypt erstellt domainvalidierte Zertifikate. Ob man die Kontrolle über die Domain hat, wird über eine Textdatei geprüft, welche im Document Root der Domain abgelegt werden muss.

Der API Server von Lets Encrypt ruft diese dann mit ein wenig Crypto-Foo ab.

Lets Encrypt bietet auch an einen eigenen Webserver für diese Prüfung zu nutzen. Diesem Braten traue ich allerdings nicht, weswegen ich die Prüfdateien direkt Nginx ablegen lasse.

Mal ganz davon abgesehen, dass dieser Lets Encrypt Webserver auch auf Port 80 laufen soll, und da läuft schon mein Nginx. Also wird einfach ein Alias in den server {} Block eingebaut:

location /.well-known {
   root /home/certs/acme-well-known;
}

Im Homeverzeichnis des Benutzers unter dem der Lets Encrypt Client geklont wurde, habe ich ein Verzeichnis angelegt, welches die Validationsdateien enthält. Dieses Verzeichnis ist das Ziel des Alias.

So funktioniert auch eine Verlängerung später ohne Probleme.

Zertifikat beantragen

Selbst wenn der Client aktuell mit nginx umgehen könnte, würde ich auf keinen Fall einen automatischen Prozess an meiner Webserver Konfiguration rumfummeln lassen. Solche Tools haben noch nie auf dauer funktioniert, und werden es auch nie.

Aus dem Grund wird das Zertifikat einzeln beantragt und manuell in meine Konfiguration eingebunden.

./letsencrypt-auto certonly --webroot --webroot-path /home/certs/acme-well-known/ -m cert@example.com -d letsencrypt.anyserver.net

Wenn alles korrekt konfiguriert ist, sollte folgendes kommen:

Updating letsencrypt and virtual environment dependencies.......
Running with virtualenv: su_sudo /home/certs/.local/share/letsencrypt/bin/letsencrypt certonly --webroot --webroot-path /home/certs/acme-well-known/ -d letsencrypt.anyserver.net
Password: 

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/letsencrypt.anyserver.net/fullchain.pem. Your
   cert will expire on 2016-03-03. To obtain a new version of the
   certificate in the future, simply run Lets Encrypt again.
 - If like Lets Encrypt, please consider supporting our work by:

   Donating to ISRG / Lets Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Einbinden

Das neue Zertifikat wurde in /etc/letsencrypt/live/ abgelegt.

root@web:/etc# ls -lisa /etc/letsencrypt/live/letsencrypt.anyserver.net/
total 8
790915 4 drwxr-xr-x 2 root root 4096 Dec  4 11:45 .
790912 4 drwx------ 3 root root 4096 Dec  4 11:45 ..
790916 0 lrwxrwxrwx 1 root root   49 Dec  4 11:45 cert.pem -> ../../archive/letsencrypt.anyserver.net/cert1.pem
790918 0 lrwxrwxrwx 1 root root   50 Dec  4 11:45 chain.pem -> ../../archive/letsencrypt.anyserver.net/chain1.pem
790919 0 lrwxrwxrwx 1 root root   54 Dec  4 11:45 fullchain.pem -> ../../archive/letsencrypt.anyserver.net/fullchain1.pem
790917 0 lrwxrwxrwx 1 root root   52 Dec  4 11:45 privkey.pem -> ../../archive/letsencrypt.anyserver.net/privkey1.pem

Diese wie gewohnt in Nginx einbinden:

server {
   listen 80;
   server_name letsencrypt.anyserver.net;

   listen 443;
   ssl on;
   ssl_certificate      /etc/letsencrypt/live/letsencrypt.anyserver.net/fullchain.pem;
   ssl_certificate_key  /etc/letsencrypt/live/letsencrypt.anyserver.net/privkey.pem;

   location /.well-known {
      root /home/certs/acme-well-known;
   }
}

Verlängern

Den Lets Encrypt Client einfach erneut aufrufen, Nginx reloaden, fertig.

Hier gibt es aktuell noch keinen automatischen Prozess. Ein interessanter Ansatz ist allerdings, einfach ein Scritp das Ablaufdatum der Zertifikate checken zu lassen und x Tage vor ablauf den Verlängerungdprozess laufen zu lassen.

Hierfür gibt es auch schon erste Beispiele:

http://eblog.damia.net/2015/12/03/lets-encrypt-automation-on-debian/

Kritik

Wirklich stören tut mich eigentlich nur, dass jeder einzelne Aufruf root Rechte abfragt. Selbst die Anzeige der Hilfe erfordert root Rechte (lol).

Als nächstes werde ich mal alternative Implmentierungen des ACME Protokolls ausprobieren. Die sehen sehr vielversprechend aus.

https://github.com/diafygi/acme-tiny
https://github.com/kuba/simp_le

Bei beiden Implementierungen ist der Grundgedanke, dass wirklich nur das Zertifikat erstellt wird, und alles andere manuell erfolgen muss. Was ja genau das wäre, was ich suche.

Updates folgen.

Update vom 07.04.2016

Ich habe einen zweiten Anlauf mit Lets Encrypt hinter mir. In einem separaten Post beschreibe ich, wie man Lets Encrypt für mehrere Subdomains gleichzeitig nutzen kann.

Dort findet Ihr auch ein Beispiel, wie Lets Encrypt voll automatisch aufgerufen werden kann.

Hallo Internet

Mein Name ist Christian, vom Beruf bin ich Anwendungsentwickler.

In meiner Freizeit beschäftige ich mich mit verschiedensten Technologien. Hier sammele ich Dinge, die für mich interessant waren oder sind.