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
$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