Inhaltsverzeichnis

Let's Encrypt

Wir verwenden ACME-Tiny. Das ist nur genau ein Python-Script was man benutzen muß. Das kann dann ganz leicht in eine eigene, überschaubare Umgebung eingebaut werden.

Erstinstallation

  1. Installation des Scripts und der Umgebung
    apt-get install acme-tiny
    
    mkdir /var/www/lets_encrypt
    cd /var/www
    chmod 750 lets_encrypt
    chgrp www-data lets_encrypt
  2. Account-Schlüssel anlegen
    cd /var/www/lets_encrypt
    openssl genrsa 2048 > account.key
    chmod 400 account.key
  3. Domainschlüssel anlegen
    openssl genrsa 2048 > /etc/ssl/private/<domain>.key
    chmod 640 /etc/ssl/private/<domain>.key
  4. SAN-Konfiguration erstellen, SAN können über die Angabe einer Konfigurationsdatei mit Optionen eingestellt werden. Beachte, daß die Hauptdomain ebenfalls in die Liste der SAN eingeschlossen wird.
    domain-san.conf
    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
     
    [req_distinguished_name]
    CN = www.example.com
     
    [v3_req]
    subjectAltName = @alt_names
     
    [alt_names]
    DNS.1 = example.com
    DNS.2 = www.example.com
    DNS.3 = sub.www.example.com
  5. CSR erstellen
    openssl req -new -sha256 -key /etc/ssl/private/<domain>.key \
        -subj "/CN=<domain1>" -config <domain>-san.conf > <domain>.csr
    chmod 640 <domain>.csr
  6. Prüfe, ob der CSR korrekten Inhalt hat
    openssl req -in <domian>.csr -noout -text
  7. Verzeichnis für Challenges erstellen und über den Webserver freigeben
    mkdir challenges
    chmod 750 challenges
    chgrp www-data challenges
    • Lighttpd:
      /etc/lighttpd/lighttpd.conf
      alias.url += ( "/.well-known/acme-challenge/" => "/var/www/lets_encrypt/challenges/" )
       
      $HTTP["scheme"] == "http" {
      	url.redirect = (
      		"^/\.well-known/acme-challenge/.*" => "",
      		"^/(.*)" => "https://www.example.com/$1"
      	)
      }
    • Apache:
      /etc/apache2/sites-available/000-default.conf
      Alias "/.well-known/acme-challenge" "/var/www/lets_encrypt/challenges"
      [...]
      SSLCertificateFile /var/www/lets_encrypt/signed.crt
      SSLCertificateKeyFile /var/www/lets_encrypt/domain.key

      Falls SSL erzwungen werden soll, so kann dieses wie folgt eingestellt werden

      RedirectMatch Permanent ^(?!/\.well-known/).* https://www.example.com
    • Nginx:
      /etc/nginx/default
      location ^~ /.well-known/acme-challenge/ {
          default_type "text/plain";
          alias /var/www/lets_encrypt/challenges/;
      }
      location = /.well-known/acme-challenge/ {
          return 404;
      }
  8. Zertifikat anfordern
    acme-tiny --account-key account.key --csr <domain>.csr --acme-dir /var/www/lets_encrypt/challenges/ > <domain>.crt
    chmod 640 <domain>.crt
  9. Zertifikat an Zielposition ablegen
    cp -p <domain>.crt /etc/ssl/certs/
  10. Anschließend Zertifikat und Schlüssel im der entsprechenden Webserverkonfiguration einbauen
  11. Webserver neu laden
    • Apache: /etc/init.d/apache2 reload
    • Nginx: /etc/init.d/nginx reload

Überprüfung

In regelmäßigen Abständen wird überprüft, ob das Zertifikat erneuert werden muß. Dieses kann durch einen täglichen oder wöchentlichen Cronjob erledigt werden.

Mauell den Inhalt eines zertifikats anzeigen

openssl x509 -in <certificate>.crt -text -noout

Erneuerung

  1. Erneuertes Zertifikat anfordern
    cd /var/www/lets_encrypt
    acme-tiny --account-key account.key --csr <domain>.csr --acme-dir /var/www/lets_encrypt/challenges/ > <domain>.crt
    chmod 640 <domain>.crt
  2. ggf. Intermediate Zertifikat holen und anfügen
    wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
    cat intermediate.pem >> <domain>.crt
  3. Zertifikat ind Schlüssel an Zielposition ablegen
    cp -p <domain>.crt /etc/ssl/certs/
  4. Neuladen der Serverkonfiguration
    /etc/init.d/apache2 reload
    bzw.
    /etc/init.d/nginx reload