kaffeeringe.de

Verschlüsselung: Mein erstes Let’s Encrypt Zertifikat

Foto: Christian Schnettelker - CC BY 2.0
Foto: Christian Schnettelker - CC BY 2.0

„Alles ver­schlüs­seln, was man ver­schlüs­seln kann,“ lau­tet die Losung spä­tes­tens seit Edward Snowden uns vor Augen ge­führt hat, was die Geheimdienste al­les über­wa­chen. So nach und nach kom­men die ver­schie­de­nen Initiativen da­zu auch in Fahrt. Ein Flaschenhals wa­ren bis­her im­mer die Kosten für Zertifikate. Let’s Encrypt will das än­dern und bie­tet seit Anfang Dezember kos­ten­lo­se SSL-Zertifikate an. Ich ha­be die frei­en Tage ge­nutzt, um mir mein ers­tes ei­ge­nes Zertifikat zu er­stel­len und zu in­stal­lie­ren.

Die meis­te Zeit ist für den ver­geb­li­chen Versuch drauf­ge­gan­gen, Let’s Encrypt mit mei­nem Provider All-Inkl.com zu ver­kup­peln. Letztlich ist es dar­an ge­schei­tert, dass All-Inkl.com selbst schon an ei­ner Implementierung im Backend ar­bei­tet, die frei­ge­schal­tet wird, so­bald Let’s Encrypt die Beta-Phase ver­lässt.

Auf ei­nem an­de­ren Server aber ging es. Let’s Encrypt bie­tet ei­nen Client, der die Zertifikate er­stellt und in­stal­liert – al­ler­dings klappt das so ganz au­to­ma­ti­sch nicht mit dem nginx-Webserver. Da mus­s­te ich ein we­nig bas­teln:

Im Homeverzeichnis ha­be ich mir ein Verzeichnis SSL an­ge­legt:

1
mkdir SSL

Dann ha­be ich mir den Let’s Encrypt-Client di­rekt aus dem Git in­stal­liert:

1
2
3
su­do apt-get in­stall git
git clo­ne https://github.com/let­sen­crypt/let­sen­crypt
cd let­sen­crypt

Der Client legt ei­ne Datei mit ei­nem Namen und Inhalt aus zu­fäl­li­gen Zeichen an, die Let’s Encrypt dann ver­sucht über das Internet auf­zu­ru­fen. So stellt der Dienst fest, ob ich be­rech­tigt bin, das Zertifikat für die Domain zu be­an­tra­gen. Die Datei liegt dann im Verzeichnis .well_known/acme_challenge – Dieses Verzeichnis hält man am bes­ten aus dem nor­ma­len Webverzeichnis her­aus und lässt dort auch nur die Auslieferung rei­ner Text-Dateien zu. Deswegen le­ge ich die Zertifikate ab un­ter /var/www/letsencrypt:

1
su­do mkdir /var/www/let­sen­crypt

Diese Location muss nun dem nginx be­kannt ge­macht wer­den. In der Config mus­s­te ich da­zu er­gän­zen:

1
2
3
4
5
6
7
lo­ca­ti­on ^~ /.well-known/acme-challenge {
  default_type text/plain;
  root /var/www/letsencrypt;
}
lo­ca­ti­on = /.well-known/acme-challenge/ {
  re­turn 404;
}

Jetzt kann ich das Zertifikat be­an­tra­gen:

1
su­do ./letsencrypt-auto cer­ton­ly --we­broot -w /var/www/let­sen­crypt -d MYDOMAIN.COM

Nun än­de­re ich die Zugriffsrechte für die Zertifikatsdateien, so dass da nur her­an­kommt, wer es wirk­li­ch muss:

1
2
3
4
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/fullchain.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/privkey.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/chain.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/cert.pem

SSL bzw. TLS läuft üb­li­cher­wei­se auf Port 443 – auf dem hat mein Webserver bis­her nicht ge­lauscht. Das muss ich jetzt um­stel­len und ich wer­den auch gleich ein­stel­len, dass al­le un­ver­schlüs­sel­ten Anfragen auf Port 80 um­ge­lei­tet wer­den. In der Config steht dann am Anfang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ser­ver {
        lis­ten 80;
        server_name MYDOMAIN.COM;
        re­turn 301 https://MYDOMAIN.COM$request_uri;
}

ser­ver {
        lis­ten 443; 

        ssl on;

        ssl_certificate /etc/letsencrypt/live/MYDOMAIN.COM/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/MYDOMAIN.COM/privkey.pem;

Nun muss der Webserver ein­mal die neue Config la­den:

1
su­do ser­vice nginx re­start

Und schon ist die ge­sam­te Site nur no­ch per HTTPS er­reich­bar!

Die Zertifikate von Let’s Encrypt sind nur 90 Tage gül­tig. Da ich kei­ne Lust ha­be, das im­mer ma­nu­ell zu ma­chen, ha­be ich mir ein klei­nes Shell-Script ge­schrie­ben:

1
2
cd ~/SSL
na­no update.MYDOMAIN.COM

Darin steht:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

let­sen­crypt/letsencrypt-auto cer­ton­ly --renew-by-default --we­broot -w /var/www/let­sen­crypt -d MYDOMAIN.COM

ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/fullchain.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/privkey.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/chain.pem
ch­mod 600 /etc/let­sen­crypt/li­ve/MYDOMAIN.COM/cert.pem

ser­vice nginx re­start

Und das ru­fe ich in der Crontab au­to­ma­ti­sch im­mer am 15. je­den Monats, mor­gens um 6:10 Uhr auf:

1
su­do na­no /etc/cron­tab

Der neue Eintrag lau­tet:

1
10 6   15 * *   root    ~/SSL/update.MYDOMAIN.COM

Damit der Cron-Dienst das auch weiß, muss auch der ein­mal neu ge­star­tet wer­den:

1
su­do ser­vice cron re­start

Fertig.

Soweit ich das ver­stan­den ha­be, funk­tio­niert das meis­te da­von bei Apache als Webserver schon au­to­ma­ti­sch. Auf SSL um­stel­len muss man den Server trotz­dem no­ch ma­nu­ell. Für ei­nen Service in der Beta-Phase läuft es aber schon ganz gut und auch die an­de­ren Experimente, über die ich auf dem Weg ge­le­sen ha­be, se­hen viel­ver­spre­chend aus. Wenn Hoster wie All-Inkl.com das System dann in ih­re Kundenverwaltung ein­bin­den, ist das nur no­ch ein Häkchen, das man set­zen muss. Das ist gut – aber auch nur die hal­be Miete. Die Umstellung ei­ner be­stehen­den WordPress-Seite auf SSL hat si­ch auch schon nicht als ganz so ein­fach her­aus­ge­stellt. Insgesamt wird das aber ein Schritt da­zu sein, dass Verschlüsselung im­mer nor­ma­ler wird.

Kommentare

Kai

Super, dann wol­len wir hof­fen, dass die Beta-Phase bald be­en­det wird! 

Danke, dass Du mir die Anfrage bei Allinkl er­spart hast!

Schreibe einen Kommentar

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

Möchtest Du benachrichtigt werden, wenn Dir hier jemand antwortet?