Gehe zu deutscher Webseite

ViaThinkSoft CodeLib

Dieser Artikel befindet sich in:
CodeLibHowTos

Dieses Beispiel zeigt auf, wie man Let's Encrypt verwenden kann, um Zertifikate mit einer individuellen Automatik zu erstellen, anstelle sich auf die 100% Automatik von Let's Encrypt zu verlassen. Sie behalten somit stets die volle Kontrolle über Ihre Webserver-Konfiguration und die Zertifikate und müssen sich nicht sorgen, dass ein fremdes Programm Ihre Konfigurationen des Webservers stört. Das Verwenden der Zertifikate für andere Dienste (MySQL, FTP, IMAP, SMTP etc) ist dadurch einfach zu bewerkstelligen.

Diese Anleitung erfordert, dass Sie bereits übere eine fertig eingerichtete Apache-Installation verfügen, und sich mit SSL auskennen. Diese Anleitung spricht insbesondere Webmaster an, die von einer bestehenden CA zu Let's Encrypt wechseln wollen.

In unserem Beispiel speichern wir unsere Zertifikats-Relevanten Daten in /daten/ssl/letsencrypt . Alle hier gezeigten Verzeichnis-Namen und Einstellungen sind selbstverständlich nur Beispiele.

Durchführung

1. Installieren von mod_macro für Apache2 (optional, aber sehr hilfreich).

Führen Sie folgende Befehle aus:

sudo aptitude install libapache2-mod-macro


sudo a2enmod macro


2. Einrichten einiger Macros. Erstellen Sie /etc/apache2/sites-available/000-macros.conf

<Macro LetsEncryptProxy>
     <IfModule mod_proxy.c>
          ProxyPass "/.well-known/acme-challenge/" "http://127.0.0.1:999/.well-known/acme-challenge/" retry=1
          ProxyPassReverse "/.well-known/acme-challenge/" "http://127.0.0.1:999/.well-known/acme-challenge/"
          <Location "/.well-known/acme-challenge/">
               ProxyPreserveHost On
               Order allow,deny
               Allow from all
               Require all granted
          </Location>
     </IfModule>
</Macro>

<Macro LetsEncryptSSL $sitedirname $ssl_log>
     SSLEngine on
     SSLCertificateFile "/daten/ssl/letsencrypt/$sitedirname/certificate.pem"
     SSLCertificateKeyFile "/daten/ssl/letsencrypt/$sitedirname/private.key"
     SSLCertificateChainFile "/daten/ssl/letsencrypt/$sitedirname/intermediate_ca.pem"
     SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
     CustomLog "$ssl_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</Macro>


3. Fügen Sie die Zeile "Use LetsEncryptProxy" in jedem <VirtualHost> Block in Ihren Webseiten-Konfigurationen ein. (/etc/apache2/sites-available/*.conf)

Sollte die Validierung der Domain im späteren Prozess fehlschlagen, könnte eventuell eine Rewrite-Rule dies verhindern. In diesem Fall muss folgende Zeile dem jeweiligen Rewrite-Abschnitt hinzugefügt werden:

RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/


4. Neu-Starten von Apache:

sudo service apache2 restart


5. Erstellen Sie folgendes Script: /daten/ssl/letsencrypt/renew-all.sh

#!/bin/bash

DIR=$( dirname "$0" )
cd "$DIR"

if [ -d _certbot ]; then
     cd _certbot
     git pull
     cd ..
else
     git clone https://github.com/certbot/certbot _certbot
fi

./website1/renew.sh
./website2/renew.sh
./website3/renew.sh
./.../renew.sh

service apache2 restart

# Falls Sie eines der Zertifikate für andere Dienste verwenden, aktivieren Sie bitte die jeweiligen Einträge durch Entfernen der Raute:
#service vsftpd restart
#service postfix restart
#service cyrus-imapd restart
#service cyrus2.2 restart
#service webmin restart
#service mysql restart


und geben ihm Ausführungs-Berechtigungen:

chmod +x /daten/ssl/letsencrypt/renew-all.sh


6. Fügen Sie einen Cronjob für den Benutzer root hinzu, um die Zertifikats-Erneuerung regelmäßig durchzuführen:

sudo crontab -e


Und fügen Sie folgende Zeile an:

0   0   1   *   *    /daten/ssl/letsencrypt/renew-all.sh


7. Richten Sie die einzelnen Webseiten ein (wie unten beschrieben)

8. Rufen Sie /daten/ssl/letsencrypt/renew-all.sh das erste Mal manuell auf und folgen den Bildschirm-Anweisungen bzw. achten auf etwaige Fehlermeldungen.



Für jede Webseite (die ggf. mehrere Domains enthält), gehen Sie wie folgt vor:

1. Erstellen Sie /daten/ssl/letsencrypt/webseite1/openssl.cnf

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = www.domain1.de

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = domain1.de
DNS.2 = www.domain2.de
DNS.3 = domain2.de
...


2. Erstellen Sie /daten/ssl/letsencrypt/webseite1/renew.sh

#!/bin/bash

EMAIL=....Ihre E-Mail-Adresse....
RSASIZE=4096

# ---

DIR=$( dirname "$0" )
cd "$DIR"

rm private.key
openssl genrsa -out private.key $RSASIZE
chown root.ssl private.key
chmod 400 private.key

rm request.csr
openssl req -new -batch -sha256 -key private.key -config openssl.cnf -out request.csr

rm *_cert.pem 2> /dev/null
rm *_chain.pem 2> /dev/null

../_certbot/letsencrypt-auto certonly \
     --authenticator standalone --preferred-challenges http-01 --http-01-port 999 \
     --server https://acme-v01.api.letsencrypt.org/directory --text \
     --email $EMAIL \
     --csr request.csr

mv -f 0000_cert.pem certificate.pem
mv -f 0000_chain.pem intermediate_ca.pem
rm *_cert.pem 2> /dev/null
rm *_chain.pem 2> /dev/null

./archive


und geben ihm Ausführungs-Berechtigungen:

chmod +x /daten/ssl/letsencrypt/webseite1/renew.sh


2. Erstellen Sie /daten/ssl/letsencrypt/webseite1/archive
Dieses optionale Script archiviert alle gültigen Zertifikate, um im Notfall ein Revoke durchführen zu können.

#!/usr/bin/php
<?php

// shows the path of the actual symlink-file, not the symlink target directory
define(REAL_DIR, dirname($argv[0]));

$cont = file_get_contents(REAL_DIR.'/certificate.pem');
$data = openssl_x509_parse($cont);

define('OLD_DIR', REAL_DIR.'/old');

if (!is_dir(OLD_DIR)) {
        mkdir(OLD_DIR);
}

if (!cert_expired($data)) {
        copy_(REAL_DIR.'/certificate.pem', OLD_DIR.'/cert_'.$data['validFrom_time_t'].'.pem');
        copy_(REAL_DIR.'/private.key', OLD_DIR.'/priv_'.$data['validFrom_time_t'].'.key');
}

$files = glob(OLD_DIR.'/cert_*.pem');
foreach ($files as $file) {
        $cont = file_get_contents($file);
        $data = openssl_x509_parse($cont);
        if (cert_expired($data)) {
                unlink($file);
                $priv_file = dirname($file).'/'.str_replace(array('cert_', '.pem'), array('priv_', '.key'), basename($file));
                unlink($priv_file);
        }
}

# ---

function cert_expired($data) {
        return time() > $data['validTo_time_t'];
}

function copy_($src, $dst) {
     if (!file_exists($dst)) {
          copy($src, $dst);
          touch($dst, filemtime($src));
     }
}


und geben ihm Ausführungs-Berechtigungen:

chmod +x /daten/ssl/letsencrypt/webseite1/archive


4. Editieren Sie die jeweiligen Einstellungen der Webseite in /etc/apache2/sites-available/ .

Hier fügen Sie in den SSL (Port 443) VirtualHosts jeweils folgenden Befehl ein, um SSL zu aktivieren:

Use LetsEncryptSSL website1 /var/log/..../website1/ssl_request.log


Daniel Marschall
ViaThinkSoft Mitbegründer, Security Management
ViaThinkSoft Co-Founder, Security Management