Let's Encrypt ...
Wie versprochen, kommt jetzt auch mal ein Artikel, wie man Let's Encrypt für die eigenen Domains nutzen kann. Aus "in ein paar Tagen" wurden leider drei Monate.
Der Grund für die Verzögerung ist neben der fehlenden Zeit, einen vernünftigen Artikel zu verfassen, die schiere Menge an Implementationen des zugrundeliegenden ACME-Protokolls. Den Original-Client möchte ich nicht benutzen, da er mir zu viele Änderungen am System (als root) vornimmt. acme-tiny schien eine Zeit lang das Mittel der Wahl zu sein.
Das Tool, was ich jetzt aber benutze, ist AcmeFetch von Tobias Oetiker, weil es wirklich einfach und damit für jeden nutzbar ist und weil ich den Macher kenne
Es muss nicht als root-User laufen, kann aber.
Die Vorarbeiten sind ein kleines wenig aufwändiger, das eigentliche Erstellen lassen der Zertifikate und auch der Refresh alle 90 Tage ist aber sehr, sehr einfach.
Vorarbeiten:
Einen Userkey erzeugen, mit dem die künftigen Zertifikate bestellt werden.
# Einen Usernamen festlegen, der wird später gebraucht
$ export USER="Euer Lieblingsusername"
# Key erzeugen
$ openssl genrsa 4096 > ${USER}.key
Generating RSA private key, 4096 bit long modulus
...................................................................................++
..................................++
e is 65537 (0x10001)
AcmeFetch basiert auf Perl, daher sollte Perl installiert sein.
# CentOS
$ yum install perl-core openssl-devel gcc unzip
# Debian/Ubuntu
$ apt-get install perl libssl-dev gcc unzip make
AcmeFetch besorgen:
Danach das Repository klonen oder ein Release herunterladen, oops, das aktuelle Release heisst "Dirk".
$ git clone https://github.com/oetiker/AcmeFetch.git AcmeFetch.git
Jetzt geht es los:
Wenn AcmeFetch gebaut wird, werden alle benötigten Perl-Module im Zielverzeichnis/lib installiert. Das bestehende System wird nicht verändert. Tobi empfiehlt
$ ./configure --prefix=/opt/acmefetch
$ make
# sudo nur nötig, wenn das Ziel-Verzeichnis als User nicht schreibbar ist
$ sudo make install
Zertifikat konfigurieren:
Im Verzeichnis
Für meine Version muss das Verzeichnis
{
"GENERAL": {
"ACMEstaging": "acme-staging.api.letsencrypt.org",
"ACMEservice": "acme-v01.api.letsencrypt.org",
"accountKeyPath": "/etc/letsencrypt/ddeimeke.key"
},
"CERTS": [
{
"certOutput": "/etc/letsencrypt/deimeke.net.crt",
"certFormat": "PEM",
"keyOutput": "/etc/letsencrypt/deimeke.net.key",
"keyFormat": "PEM",
"chainOutput": "/etc/letsencrypt/chain.crt",
"chainFormat": "PEM",
"commonName": "deimeke.net",
"SITES": {
"deimeke.net": {
"challengeHandler": "LocalFile",
"challengeConfig": {
"www_root": "/srv/www/deimeke.net/",
}
},
"www.deimeke.net": {
"challengeHandler": "LocalFile",
"challengeConfig": {
"www_root": "/srv/www/deimeke.net/",
}
}
}
}
]
}
Der Betriebssystem-User, der das Zertifikat erstellen lassen möchte, benötigt Schreibrechte im DocumentRoot-Verzeichnis der Domain (genauer im Unterverzeichnis
Achtung: Es ist sinnvoll, vor dem eigentlichen Erstellen der Zertifikate eventuell vorhandene
Zertifikat erstellen:
$ /opt/acmefetch/bin/acmefetch --cfg=/opt/acmefetch/etc/deimeke.net.cfg --verbose
* ## deimeke.net ##
* Cert /etc/letsencrypt/deimeke.net.crt is missing. Generating.
* talk to acme-v01.api.letsencrypt.org
* authorize deimeke.net via /srv/www/deimeke.net/
* authorize www.deimeke.net via /srv/www/deimeke.net/
/tmp/9QmdSJnbNt.cfgGenerating a 2048 bit RSA private key
.....................................+++
.....................................................................................................+++
writing new private key to '/etc/letsencrypt/deimeke.net.key.13854'
Wenn Ihr es direkt noch einmal ausführt, wird kein neues Zertifikat erstellt, nur, wenn
Webserver konfigurieren: (bei mir Apache)
Dafür habe ich mir dieses kleine Shellskript gebastelt.
#!/bin/bash
set -o errexit
if [[ -z "$2" ]]; then
echo
echo "ERROR: usage $0 domain ipaddress"
echo
exit 1
fi
DOMAIN=$1
IPADDRESS=$2
echo "<VirtualHost ${IPADDRESS}:443>
ServerName ${DOMAIN}
DocumentRoot /srv/www/${DOMAIN}
ErrorLog /var/log/httpd/${DOMAIN}/error.log
CustomLog /var/log/httpd/${DOMAIN}/access.log combined
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine On
SSLCipherSuite 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:CAMELLIA:!kRSA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
SSLCertificateFile /etc/letsencrypt/${DOMAIN}.crt
SSLCertificateKeyFile /etc/letsencrypt/${DOMAIN}.key
SSLCertificateChainFile /etc/letsencrypt/intermediate.crt
<Directory \"/srv/www/${DOMAIN}\">
allow from all
Order allow,deny
AllowOverride All
Options -Indexes
Require all granted
</Directory>
</VirtualHost>"
Weitere Domains:
Weitere Konfigurationen lassen sich mit einem einfachen
$ sed 's/deimeke.net/yawnrz.com/g' /opt/acmefetch/etc/deimeke.net.cfg > /opt/acmefetch/etc/yawnrz.com.cfg
$ /opt/acmefetch/bin/acmefetch --cfg=/opt/acmefetch/etc/yawnrz.com.cfg --verbose
Der Grund für die Verzögerung ist neben der fehlenden Zeit, einen vernünftigen Artikel zu verfassen, die schiere Menge an Implementationen des zugrundeliegenden ACME-Protokolls. Den Original-Client möchte ich nicht benutzen, da er mir zu viele Änderungen am System (als root) vornimmt. acme-tiny schien eine Zeit lang das Mittel der Wahl zu sein.
Das Tool, was ich jetzt aber benutze, ist AcmeFetch von Tobias Oetiker, weil es wirklich einfach und damit für jeden nutzbar ist und weil ich den Macher kenne

Die Vorarbeiten sind ein kleines wenig aufwändiger, das eigentliche Erstellen lassen der Zertifikate und auch der Refresh alle 90 Tage ist aber sehr, sehr einfach.
Vorarbeiten:
Einen Userkey erzeugen, mit dem die künftigen Zertifikate bestellt werden.
# Einen Usernamen festlegen, der wird später gebraucht
$ export USER="Euer Lieblingsusername"
# Key erzeugen
$ openssl genrsa 4096 > ${USER}.key
Generating RSA private key, 4096 bit long modulus
...................................................................................++
..................................++
e is 65537 (0x10001)
AcmeFetch basiert auf Perl, daher sollte Perl installiert sein.
# CentOS
$ yum install perl-core openssl-devel gcc unzip
# Debian/Ubuntu
$ apt-get install perl libssl-dev gcc unzip make
AcmeFetch besorgen:
Danach das Repository klonen oder ein Release herunterladen, oops, das aktuelle Release heisst "Dirk".
$ git clone https://github.com/oetiker/AcmeFetch.git AcmeFetch.git
Jetzt geht es los:
Wenn AcmeFetch gebaut wird, werden alle benötigten Perl-Module im Zielverzeichnis/lib installiert. Das bestehende System wird nicht verändert. Tobi empfiehlt
$HOME/opt/acmefetch
, mir ist das "reale" /opt
lieber.$ ./configure --prefix=/opt/acmefetch
$ make
# sudo nur nötig, wenn das Ziel-Verzeichnis als User nicht schreibbar ist
$ sudo make install
Zertifikat konfigurieren:
Im Verzeichnis
/opt/acmefetch/etc
liegt eine Musterkonfigurationsdatei acmefetch.cfg.dist
, die als Muster benutzt werden kann. Ich habe die etwas abgewandelt, so dass es für mich passt.Für meine Version muss das Verzeichnis
/etc/letsencrypt
schreibbar sein (da liegen alle "Let's Encrypt"-Zertifikate auf meinem Server). ddeimeke.key
müsst Ihr mit Eurem Schlüssel ersetzen.{
"GENERAL": {
"ACMEstaging": "acme-staging.api.letsencrypt.org",
"ACMEservice": "acme-v01.api.letsencrypt.org",
"accountKeyPath": "/etc/letsencrypt/ddeimeke.key"
},
"CERTS": [
{
"certOutput": "/etc/letsencrypt/deimeke.net.crt",
"certFormat": "PEM",
"keyOutput": "/etc/letsencrypt/deimeke.net.key",
"keyFormat": "PEM",
"chainOutput": "/etc/letsencrypt/chain.crt",
"chainFormat": "PEM",
"commonName": "deimeke.net",
"SITES": {
"deimeke.net": {
"challengeHandler": "LocalFile",
"challengeConfig": {
"www_root": "/srv/www/deimeke.net/",
}
},
"www.deimeke.net": {
"challengeHandler": "LocalFile",
"challengeConfig": {
"www_root": "/srv/www/deimeke.net/",
}
}
}
}
]
}
Der Betriebssystem-User, der das Zertifikat erstellen lassen möchte, benötigt Schreibrechte im DocumentRoot-Verzeichnis der Domain (genauer im Unterverzeichnis
.well-known/acme-challenge
)Achtung: Es ist sinnvoll, vor dem eigentlichen Erstellen der Zertifikate eventuell vorhandene
.htaccess
-Dateien umzubennen (beispielsweise die von ownCloud).Zertifikat erstellen:
$ /opt/acmefetch/bin/acmefetch --cfg=/opt/acmefetch/etc/deimeke.net.cfg --verbose
* ## deimeke.net ##
* Cert /etc/letsencrypt/deimeke.net.crt is missing. Generating.
* talk to acme-v01.api.letsencrypt.org
* authorize deimeke.net via /srv/www/deimeke.net/
* authorize www.deimeke.net via /srv/www/deimeke.net/
/tmp/9QmdSJnbNt.cfgGenerating a 2048 bit RSA private key
.....................................+++
.....................................................................................................+++
writing new private key to '/etc/letsencrypt/deimeke.net.key.13854'
Wenn Ihr es direkt noch einmal ausführt, wird kein neues Zertifikat erstellt, nur, wenn
--force
gesetzt ist oder 30 Tage vor Ablauf des vorhandenen Zertifkats oder, wenn Ihr in der Konfiguration etwas verändert habt.Webserver konfigurieren: (bei mir Apache)
Dafür habe ich mir dieses kleine Shellskript gebastelt.
#!/bin/bash
set -o errexit
if [[ -z "$2" ]]; then
echo
echo "ERROR: usage $0 domain ipaddress"
echo
exit 1
fi
DOMAIN=$1
IPADDRESS=$2
echo "<VirtualHost ${IPADDRESS}:443>
ServerName ${DOMAIN}
DocumentRoot /srv/www/${DOMAIN}
ErrorLog /var/log/httpd/${DOMAIN}/error.log
CustomLog /var/log/httpd/${DOMAIN}/access.log combined
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine On
SSLCipherSuite 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:CAMELLIA:!kRSA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
SSLCertificateFile /etc/letsencrypt/${DOMAIN}.crt
SSLCertificateKeyFile /etc/letsencrypt/${DOMAIN}.key
SSLCertificateChainFile /etc/letsencrypt/intermediate.crt
<Directory \"/srv/www/${DOMAIN}\">
allow from all
Order allow,deny
AllowOverride All
Options -Indexes
Require all granted
</Directory>
</VirtualHost>"
Weitere Domains:
Weitere Konfigurationen lassen sich mit einem einfachen
sed
-Kommando erstellen.$ sed 's/deimeke.net/yawnrz.com/g' /opt/acmefetch/etc/deimeke.net.cfg > /opt/acmefetch/etc/yawnrz.com.cfg
$ /opt/acmefetch/bin/acmefetch --cfg=/opt/acmefetch/etc/yawnrz.com.cfg --verbose
Trackbacks
Netz - Rettung - Recht am : SSL/TLS mit Let's Encrypt
Vorschau anzeigen
Bereits vergangene Woche berichtete ich von meinen Irrungen und Wirrungen des letzten Jahrzehnts mit SSL/TLS im Web. Erst Ende 2015 hatte ich mich aufgerafft, über StartCom für einige Domains Zertifikate erstellen zu lassen, und parallel die Berichterstat
Netz - Rettung - Recht am : Wellenreiten 04/2016
Vorschau anzeigen
Wer als “Websurfer†metaphorisch auf den Wellen des Netzes reitet, findet dabei zwar keine paradiesischen Inseln, manchmal aber immerhin ganz interessante Lektüre. Im April 2016 kann ich u.a. folgende Fundstücke empfehlen und der werten Leserschaft ans H
Dirks Logbuch am : Webspace-Inventar 2017 ...
Vorschau anzeigen
Dieser Artikel ist eine Antwort auf den Artikel von Thomas zum Thema. Auf meinem Server laufen die folgenden Webapplikationen, Reihenfolge ist alphabetisch und sagt nichts über die Wertigkeit aus. DokuWiki ist die Wikisoftware, die ich benutze, wenn ich
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt
Thomas am :
Ist aber "mutig".
Dirk Deimeke am :
John am :
Können die Dateien im "acme-challenge" Verzeichnis nach erfolgreichem Erstellen des Zertifikates gelöscht werden, oder gibt's da Nebenwirkungen?
Wenn ich mich recht erinnere, machen andere ACME-Clients das so.
Dirk Deimeke am :
Vielleicht reichst Du dafür einen Feature-Request ein?
André Jaenisch am :
wie ich mich auf der Mate Mailingliste korrigieren lassen musste (http://permalink.gmane.org/gmane.comp.desktop.mate.devel/303 - http://ml.mate-desktop.org/pipermail/mate-dev/ antwortet mit 403-Forbidden oO) liegt Thomas mit seinem Kommentar (https://thomas-leister.de/internet/prosody-xmpp-server-auf-ubuntu-server-installieren/#comment-4572) nicht ganz richtig.
Wenn du also APT in v1.0+ verwendest, kannst du mit `apt install` installieren
Gruß,
André
Dirk Deimeke am :
Udo am :
Danke für den Artikel.
Bei Debian fehlt bei den Vorarbeiten für apt-get install noch make
Sonst lief es...
Udo
Dirk Deimeke am :