Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos.
Diese Howto-Anleitung wurde zuletzt von VolkerRaschek am 29.11.2016 unter Ubuntu 14.04 und Ubuntu 16.04 erfolgreich getestet.
In diesem Artikel wird beschrieben, wie man mithilfe des Scripts getSSL von Let's Encrypt allgemein gültige Zertifikate erzeugen lassen kann. Dies ist eine Alternative zu certbot und bietet dem Nutzer mehr Kontrolle und Flexibilität. Dazu gibt es zwei verschiedene Verfahren die Zertifikate von Let's Encrypt validieren zu lassen. Das erste Verfahren basiert auf DNS-Einträge, das zweite auf validierung per Verifizierungscodes die über einen Webserver veröffentlicht werden. In diesem Artikel wird letzteres beschrieben. Hierzu ist es notwendig, dass ein Webserver über das Internet erreichbar ist. Die Installation des Webservers wird vorausgesetzt. Zur validierung der Zertifikate wird Apache2 als Webserver eingesetzt. Beispielhaft sollen Zertifikate für die Domain example.com erstellt werden mit den Subdomains mail.example.com, shop.example.com, www.example.com. Dies sind ausschließlich Beispielhafte Domainnamen und sollten durch die eigenen Domains, Subdomains oder DynDNS-Adressen ersetzt werden.
Alle Befehle werden als root Benutzer ausgeführt. Dazu ist es notwendig sich im Terminal als root Benutzer anzumelden.
sudo -i
Als nächstes wird ein Alias definiert unter Apache2. Der Alias bewirkt, dass jeder Aufruf unabhängig von der Domain und Subdomain, soweit diese auf dem Server gehostet sind, in ein und das selbe Verzeichnis verweisen. Dazu wird eine neue Alias-Datei angelegt unter /etc/apache2/conf-available.
echo "Alias /.well-known /var/www/letsencrypt/.well-known" > /etc/apache2/conf-available/letsencrypt.conf
Der Alias soll in das Verzeichnis /var/www/letsencrypt verweisen. Nun wird das Verzeichnis letsenctypt angelegt mit zwei Unterverzeichnissen, die später zur Verifizierung der Domains, Subdomains oder DynDNS-Adressen zuständig sein sollen. In dem Verzeichnis acme-challenge werden sobald Domains, Subdomains oder DynDNS-Adressen verifiziert werden, Verifizierungscodes automatisch abgelegt, sodass Let's Encrypt diese abrufen kann. Dazu ist es notwendig, dass ein Zugriff aus dem Internet möglich ist. Die Verifizierungscodes werden nach Abschluss der Verifizierung entfernt.
mkdir -p /var/www/letsencrypt/.well-known/acme-challenge/
Man Aktiviert das Alias unter Apache2 und starten den Dienst neu.
a2enconf letsencrypt service apache2 reload
Zum testen kann man im Browser nun die Domain example.com/.well-known oder die Subdomains mit mail.example.com/.well-known, shop.example.com/.well-known oder www.example.com/.well-known aufrufen. Alle Adressen sollten im Browser das Verzeichnis acme.challenge anzeigen.
Nachdem nun alle Dateien von getSSL unter /etc/getssl liegen, kann man nun mittels /etc/getssl/getssl <Parameter>
Parameter übergeben. Hier ist eine Tabelle aller Parameter mit Bedeutung.
Parameter für getSSL | ||||
Parameter | Bedeutung | |||
-a, --all | Überprüft alle Zertifikate auf Erneuerung | |||
-d --debug | Gibt Informationen zum Debuggen aus | |||
-c, --create | Erstellt Konfigurationsdateien für die zu Zertifizierende Domain | |||
-f, --force | Zwingt auf Erneuerung der Zertifikate, obwohl diese noch nicht abgelaufen sind | |||
-h, --help | Zeigt diese Hilfe an | |||
-q, --quiet | Stiller Modus, zeigt nur einen Output bei Fehlern, Bestätigung bei Erneuerung von Zertifikaten oder wenn getSSL aktualisiert wurde an | |||
-Q, --mute | Das gleiche wie -q bzw. --quite, nur dass auch Benachrichtigungen über die erfolgreiche Erneuerung von SSL Zertifikaten verhindert wird | |||
-r, --revoke cert key | Entzieht dem Zertifikat die Gültigkeit. Benötigt das Zertifikat als auch den Private Key | |||
-u, --upgrade | Aktualisiert und überprüft die getSSL Dateien auf eine neuere Version | |||
-U, --nocheck | Aktualisiert und überprüft nicht die getSSL Dateien auf eine neuere Version | |||
-w, --working_dir | Legt das Arbeitsverzeichnis fest |
Als nächstes legt man für die Domain example.com eine neues Konfigurationsverzeichnis an. Dies wird ohne den Parameter -w Standardmäßig in das Heimatverzeichnis des aktuellen Benutzers erzeugt unter ~/.getssl/<domain>. Dieses Verzeichnis wird auch Arbeitsverzeichnis oder working dir genannt.
/etc/getssl/getssl -c example.com
Die Datei ~/.getssl/example.com/getssl.cfg wird bearbeitet
nano ~/.getssl/example.com/getssl.cfg
Zu beginn der Konfigurationsdatei für die Domain example.com findet man Einstellungen für einen Server. Hier gibt es zwei Varianten. Einmal den staging Server, der Zertifikate ausstellt zum testen der Einstellungen. Die hierdurch erzeugten Zertifikate sind fake Zertifikate oder auch nicht vertrauenswürdige Zertifikate. Man kommentiert die Einstellung des Servers entsprechend ein oder aus nach unseren Bedürfnissen. Es ist jedoch Sinnvoll erst alles durch zu testen, weswegen auch der staging Server ein kommentiert ist.
# The staging server is best for testing CA="https://acme-staging.api.letsencrypt.org" # This server issues full certificates, however has rate limits #CA="https://acme-v01.api.letsencrypt.org"
In dem nächsten Block wird definiert, welche E-Mail Adresse in den Zertifikaten hinterlegt wird. Welche Bit-Stärke der Primary-Key besitzen soll, wo er gespeichert wird und welches Verfahren angewendet wird. Dieser Private Key wird auch bei getSSL Account-Key genannt. Der Pfad zum Account-Key kann angepasst werden.
# Set an email address associated with your account - generally set at account level rather than domain. ACCOUNT_EMAIL="webmaster@example.com" ACCOUNT_KEY_LENGTH=4096 ACCOUNT_KEY="/etc/ssl/private/ca/ca.key" PRIVATE_KEY_ALG="rsa"
Im nächsten Absatz wird definiert, welche Subdomains zu dem Zertifikat hinzugefügt werden sollen. Jede aufgelistete Subdomain muss später unter der Webadresse http://<subdomain>.<domain>.<tld>/.well-known verifiziert werden können.
# Additional domains - this could be multiple domains / subdomains in a comma separated list # Note: this is Additional domains - so should not include the primary domain. SANS=mail.example.com,shop.example.com,www.example.com
Nun kommt der wichtigste Block. Die Einstellung, wie Let's Encrypt die Domains für die Zertifikate erzeugt werden sollen überprüfen kann. Dazu erzeugt das Skript Verifizierungscodes. Diese sind öffentlich abrufbar. Die Gegenstelle, also die Server von Let's Encrypt überprüfen somit, ob die Domain für die Zertifikate erzeugt werden sollen auch existiert und identisch sind mit denen, die auf den eigenen Servern von Let's Encrypt für die Domain vorgehalten sind. Diese Codes können auch auf andere Server ausgelagert werden sofern die Domain auf einen anderen Server zeigt per DNS Record.
Der erste ACL Eintrag gilt für die Domain. In dem Beispiel für example.com. Der zweite Eintrag in ACL würde für die Subdomain mail.example.com gelten, der dritte Eintrag in ACL für die Subdomain shop.example.com. So kann für jede Domain ein individueller Pfad angegeben werden wo die Verifizierungscode gespeichert werden sollen damit eine Verifizierung möglich ist. Sollen die Codes auf einen externen Server gespeichert werden, kann man das auch per SSH oder FTP einrichten.
Da der Server in diesem Beispiel alle Domains hostest wäre es ja unschön für jede Subdomain den gleichen Pfad (/var/www/letsencrypt/.well-known/acme-challenge) an zu geben. Dazu bietet uns das Skript die Möglichkeit ein Pfad für alle Domains, Subdomains und DynDNS-Adressen an zu geben. Hier bietet sich die Option USE_SINGLE_ACL an.
# Acme Challenge Location. The first line for the domain, the following ones for each additional domain. # If these start with ssh: then the next variable is assumed to be the hostname and the rest the location. # An ssh key will be needed to provide you with access to the remote server. # If these start with ftp: then the next variables are ftpuserid:ftppassword:servername:ACL_location # These should be of the form "/path/to/your/website/folder/.well-known/acme-challenge" # where "/path/to/your/website/folder/" is the path, on your web server, to the web root for your domain. #ACL=('/var/www/example.com/web/.well-known/acme-challenge' # 'ssh:server5:/var/www/example.com/web/.well-known/acme-challenge' # 'ftp:ftpuserid:ftppassword:example.com:/web/.well-known/acme-challenge') ACL=('/var/www/letsencrypt/.well-known/acme-challenge') #Enable use of a single ACL for all checks USE_SINGLE_ACL="true"
Sobald Let's Encrypt die Domains verifizieren konnte, kann man optional angeben wo die Zertifikate gespeichert werden sollen. Hier werden die Zertifikate nur kopiert, da sie in Wirklichkeit im Arbeitsverzeichnis erstellt werden. In dem Arbeitsverzeichnis befindet sich auch das Archiv. Dort werden alle alten Zertifikate abgelegt. Das Arbeitsverzeichnis ist unter ~/.getssl/example.com für die Domain example.com zu finden sofern das Verzeichnis mit dem Parameter -w nicht angepasst wurde.
# Location for all your certs, these can either be on the server (so full path name) or using ssh as for the ACL DOMAIN_CERT_LOCATION="/etc/ssl/public/example.com/domain.crt" DOMAIN_KEY_LOCATION="/etc/ssl/private/example.com/domain.key" CA_CERT_LOCATION="/etc/ssl/public/example.com/chain.crt" #DOMAIN_CHAIN_LOCATION="" # this is the domain cert and CA cert #DOMAIN_KEY_CERT_LOCATION="" # this is the domain_key and domain cert #DOMAIN_PEM_LOCATION="" # this is the domain_key. domain cert and CA cert
Nun kommt der letzte Absatz. Indem eingestellt werden kann, wie viel Tage vor Ablauf der Zertifikate die Gültigkeit erneuert wird. Hierzu dient die Option RENEW_ALLOW. Die auf 30 Tage vor Ablauf der Gültigkeit eingestellt ist. Werden neue Zertifikate generiert bzw. die Gültigkeit erneuert, kann man über RELOAD_CMD Dienste neu starten, damit diese die neuen Zertifikate aufnehmen. Im Beispiel wird der Webserver Apache2 neu gestartet.
# The command needed to reload apache / nginx or whatever you use RELOAD_CMD="service apache2 reload" # The time period within which you want to allow renewal of a certificate # this prevents hitting some of the rate limits. RENEW_ALLOW="30"
Nun noch einmal die ganze Konfiguration für die Domain example.com.
# Uncomment and modify any variables you need # see https://github.com/srvrco/getssl/wiki/Config-variables for details # # The staging server is best for testing CA="https://acme-staging.api.letsencrypt.org" # This server issues full certificates, however has rate limits #CA="https://acme-v01.api.letsencrypt.org" #AGREEMENT="https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf" # Set an email address associated with your account - generally set at account level rather than domain. ACCOUNT_EMAIL="webmaster@cexample.com" ACCOUNT_KEY_LENGTH=4096 ACCOUNT_KEY="/etc/ssl/private/ca/ca.key" PRIVATE_KEY_ALG="rsa" # Additional domains - this could be multiple domains / subdomains in a comma separated list # Note: this is Additional domains - so should not include the primary domain. SANS=mail.example.com,shop.example.com,www.example.com # Acme Challenge Location. The first line for the domain, the following ones for each additional domain. # If these start with ssh: then the next variable is assumed to be the hostname and the rest the location. # An ssh key will be needed to provide you with access to the remote server. # If these start with ftp: then the next variables are ftpuserid:ftppassword:servername:ACL_location # These should be of the form "/path/to/your/website/folder/.well-known/acme-challenge" # where "/path/to/your/website/folder/" is the path, on your web server, to the web root for your domain. #ACL=('/var/www/example.com/web/.well-known/acme-challenge' # 'ssh:server5:/var/www/example.com/web/.well-known/acme-challenge' # 'ftp:ftpuserid:ftppassword:example.com:/web/.well-known/acme-challenge') ACL=('/var/www/letsencrypt/.well-known/acme-challenge') #Enable use of a single ACL for all checks USE_SINGLE_ACL="true" # Location for all your certs, these can either be on the server (so full path name) or using ssh as for the ACL DOMAIN_CERT_LOCATION="/etc/ssl/public/example.com/domain.crt" DOMAIN_KEY_LOCATION="/etc/ssl/private/example.com/domain.key" CA_CERT_LOCATION="/etc/ssl/public/example.com/chain.crt" #DOMAIN_CHAIN_LOCATION="" # this is the domain cert and CA cert #DOMAIN_KEY_CERT_LOCATION="" # this is the domain_key and domain cert #DOMAIN_PEM_LOCATION="" # this is the domain_key. domain cert and CA cert # The command needed to reload apache / nginx or whatever you use RELOAD_CMD="service apache2 reload" # The time period within which you want to allow renewal of a certificate # this prevents hitting some of the rate limits. RENEW_ALLOW="30"
Nachdem nun die Konfiguration für eine Domain abgeschlossen wurde kann man sich von getSSL die Zertifikate erzeugen lassen. Dazu verwendet man folgenden Befehl.
/etc/getssl/getssl -f example.com
Ähnliche Meldungen sollten im Terminal zu sehen sein. Der Output wurde generiert für eine Domain, deren Zertifikate noch gültig waren, allerdings einer Erneuerung erzwungen wurde.
Registering account Verify each domain Verifying example.com example.com is already validated Verifying mail.example.com mail.example.comis already validated Verifying shop.example.com shop.example.com is already validated Verifying www.example.com www.example.com is already validated Verification completed, obtaining certificate. Certificate saved in /root/.getssl/example.com/example.com.crt The intermediate CA cert is in /root/.getssl/example.com/chain.crt copying domain certificate to /etc/ssl/public/example.com/domain.crt copying private key to /etc/ssl/private/example.com/domain.key copying CA certificate to /etc/ssl/public/example.com/chain.crt reloading SSL services example.com - certificate installed OK on server certificate obtained for example.com
Damit von getSSL die Zertifikate automatisch auf Gültigkeit überprüft werden, schlägt das Entwicklerteam einen Cronjobeintrag vor. Dazu wird Crontab des Benutzers root geöffnet.
crontab -e -u root
Anschließend wird am Ende der Datei folgender Cronjobeintrag definiert. Dieser führt das getSSL Script Täglich um Mitternacht aus und überprüft alle Zertifikate im Stillenmodus und überprüft getSSL auf updates.
# Let' Encrypt # SSL Zertifikate auf updates prüfen, täglich um 00:00 Uhr 0 0 * * * /etc/getssl/getssl -a -q -u
Diese Revision wurde am 1. Februar 2017 11:25 von frustschieber erstellt.