Let's Encrypt

Aus Wiki
Wechseln zu: Navigation, Suche

Let's Encrypt ist ein Dienst, welcher kostenlose TLS-Zertifikate ausstellt. In der Regel sind diese für drei Monate und eine Domain gültig, d.h. man muss sie regelmäßig austauschen. Das ist mit etwas Aufwand verbunden, außerdem sollte es jedem möglich sein, seine Webseite zu verschlüsseln, auch, wenn man das notwendige Know-How nicht mitbringt.

ACME-Protokoll

Daher gibt es ein eigens Protokoll namens Automated Certificate Management Environment (ACME), mithilfe dessen der Vorgang automatisiert werden kann. In diesem Artikel wird die Referenzimplementierung des Clients verwendet.

ACME-Challenge

Während des automatisierten Vorgangs startet der Client seinerseits einen eigenen Webserver. Dieser hostet ein File, welches vom Validierungsdienst abgerufen wird. Stimmt der tatsächliche Inhalt mit dem erwarteten überein, wird das Zertifikat ausgestellt.

Allerdings fragt der Validierungsdienst auf Port 80 nach. Dort läuft aber – wenn es um Webseiten geht – meist bereits ein Webserver. Das Tool kann den integrierten Server also nur starten, wenn der bereits laufende Webserver abgeschaltet wird. Alternativ kann aber auch der bereits laufende Webserver für die Validierung verwendet werden

Nutzung von Apache 2.4

Die hier beschriebene Lösung leitet alle ACME-Challenge-Anfragen auf einen eigenen virtuellen Host um. Dieser soll nur von einem Validierungsdienst erreicht werden können, Anfragen anderer Clients sollten nicht erlaubt sein. Das Hosting der ACME-Challenge-Files muss logischerweise nur ein Mal konfiguriert werden. Es wird dann für alle VHosts wieder verwendet.

Hosting der ACME-Challenge-Files

Der ACME-Client legt die Files im Dateiverzeichnis ab, es muss also ein Ordner angelegt und in der Konfigurationsdatei als DocumentRoot angegeben werden:

sudo mkdir /var/www/acme-client/

Für den virtuellen Host wurde ein eigener Eintrag im DNS gemacht, über diesen der virtuelle Host erreichbar ist. Die Konfiguration wird unter /etc/apache2/sites-available/acme-client.conf abgespeichert:

<VirtualHost *:80>
  DocumentRoot /var/www/acme-client
  ServerName http://acme-client.example.com
  ServerAdmin webmaster@localhost
  <If "%{HTTP_USER_AGENT} !~ /Let\'s Encrypt validation server/">
    Require all denied
  </If>
</VirtualHost>

Deutlich eleganter wäre natürlich, nur bestimmte IP-Adressen den Zugriff darauf zu gestatten. Leider war zum zum Zeitpunkt des Niederschreibens der IP-Range der Validierungsdienste nicht bekannt. Daher muss auf den Parameter HTTP_USER_AGENT ausgewichen werden.

Anschließend wird die Seite noch aktiviert und die Serverkonfiguration neu eingelesen:

sudo a2ensite acme-client
sudo service apache2 reload

Beispielseite

Als Beispiel wird hier page.example.com verwendet. Vor der Apache-Konfiguration ist darauf zu achten, dass ein ensprechender DNS-Eintrag angelegt wird. Ein Vorschlag ist, für jede Webseite eine eigene Konfigurationdatei anzulegen. Empfehlenswert ist weiterhin sowohl den Teil der Konfiguration für Port 80 als auch den für Port 443 ins selbe File zu schreiben. So kann die Webseite leichter als gesamtes ein- und ausgeschaltet sowie umgezogen werden.

Da noch keine Zertifikate für die Seite existieren, kann zunächst nur der Teil über Port 80 konfiguriert werden. Dieser enthält zwei wichtige Teile:

  • ACME-Challenge-Anfragen werden an den jeweiligen Server weitergeleitet
  • andere Anfragen werden nicht behandelt, der Anfragesteller wird auf HTTPS verwiesen.

page.example.com.conf enthält zunächst also diese Konfiguration:

<VirtualHost *:80>
  ServerName http://page.example.com
  ServerAdmin webmaster@localhost
 
  RewriteEngine On
 
  #Behandlung von ACME-Challenge-Anfragen
  RewriteCond %{REQUEST_URI} ^/\.well-known\/acme-challenge\/?.*
  RewriteRule ^ http://acme-client.example.com%{REQUEST_URI}
 
  #Behandlung anderer Anfragen
  RewriteCond %{HTTPS} !=on
  RewriteCond %{REQUEST_URI} !^/\.well-known\/acme-challenge\/?.*
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

Damit kann die Seite schon einmal aktiviert werden und die Apache-Konfiguration neu geladen werden:

sudo a2ensite page.example.com
sudo service apache2 reload

Die Seite ist jetzt unverschlüsselt erreichbar. ACME-Anfragen werden auf den anderen VHost umgeleitet. Damit können die Zertifikate bereits generiert werden:

./letsencrypt-auto certonly            \
  --webroot -w /var/www/acme-client/   \
  --email mail@example.com   \
  -d page.example.com

Wenn alles gut ging, wurden die TLS-Zertifikate erstellt. Jetzt kann die vorherige Konfigurationdatei um den HTTPS-Teil erweitert werden:

<IfModule mod_ssl.c>
  <VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/page.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/page.example.com/privkey.pem
    SSlCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ServerName https://page.example.com
    ServerAdmin webmaster@localhost
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
  </VirtualHost>
</IfModule>

Nach einem erneuten Neu-Laden der Apache-Konfiguration sollte auch diese übernommen werden:

sudo service apache2 reload

Referenzen

Referenzimplemetierung des ACME-Protokolls