Intelligente Lösungen
in neuer Dimension

LETSENCRYPT: SAN-Zertifikate auftrennen

Seit ein paar Jahren benutze ich LetsEncrypt-Zertifikate. Ursprünglich fand ich’s mal eine tolle Idee, SAN-Zertifikate zu verwenden. Das sind einzelne Zertifikate, die für mehrere Domains ausgestellt werden, beispielsweise für

  • daemons-point.com
  • www.daemons-point.com
  • internal.daemons-point.com
  • mail.daemons-point.com
  • etc

Wahrscheinlich war meine Idee damals, dass wir auf diese Weise weniger wahrscheinlich in die LetsEncrypt-Begrenzungen (Anzahl der Zertifikate, etc) laufen.

Heute ist meine Bewertung diese:

  • die LetsEncrypt-Begrenzungen spielen für uns keine Rolle
  • wir sind unflexibel, wenn unsere Zertifikate und Domains gebündelt sind, beispielsweise ist es problematisch, einzelne Domains umzuziehen von “intern gehostet” zu “extern” und umgekehrt

Also: Wir müssen die Zertifikate auftrennen!

Ermitteln der aktuell verwendeten Zertifikate

Welche Zertifikate finden wir? Wie sehen die Subject/CN und DNS-Einträge aus?

1
2
3
4
5
6
7
8
9
10
11
$ find . -name "*.crt" -o -name "*.pem" | while read f; do openssl x509 -text -in $f 2>/dev/null|grep "DNS"|tr "," "\n"|tr -d " "|cut -d: -f2; openssl x509 -text -in $f 2>/dev/null|grep "Subject:"|grep -o "CN=[^/]*"|grep -v X3|cut -d= -f2;done|sort -u
83.236.132.110
daemons-point.com
*.daemons-point.com
extern.daemons-point.com
internal.daemons-point.com
mail.daemons-point.com
pag.support
ppnproxy.pag.support
sysmt.pag.support
tk.daemons-point.com

pag.support

chained-san.pem

  • Subject: CN=pag.support
  • DNS:pag.support
  • DNS:ppnproxy.pag.support
  • DNS:sysmt.pag.support

chained.pem

Uralt, nicht mehr verwendet!

signed-san.crt

Uralt, nicht mehr verwendet!

signed.crt

Uralt, nicht mehr verwendet!

internal.daemons-point.com

Wie’s aussieht, sind hier zwar LetsEncrypt-Zertifikate verfügbar, sie werden aber nicht verwendet.

Neuestes Zertifikat: chained-san.pem, gültig bis 18. Jubni 2020

  • CN=internal.daemons-point.com
  • DNS:internal.daemons-point.com
  • DNS:mail.daemons-point.com

helsinki

chained-san.pem

  • Subject: CN = extern.daemons-point.com
  • DNS:extern.daemons-point.com

signed-san.crt

Uralt, nicht mehr verwendet!

extern.daemons-point.com.crt

  • Subject: CN = extern.daemons-point.com
  • DNS:extern.daemons-point.com

tk.daemons-point.com.crt

  • Subject: CN = tk.daemons-point.com
  • DNS:tk.daemons-point.com

Aktionen

Aktuell verwendete SAN-Zertifikate

  • pag.support
    • pag.support
    • ppnproxy.pag.support
    • sysmt.pag.support … entfällt
  • internal.daemons-point.com
    • internal.daemons-point.com
    • mail.daemons-point.com

Einzelne Keys und CSRs

Hilfsskript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

key () {
    openssl genrsa 4096 > "${1}.key"
}

csr () {
    openssl req -new -sha256 -key "${1}.key" -subj "/CN=${1}" \
     -reqexts SAN -config <(\
        cat /etc/ssl/openssl.cnf <(\
         printf "[SAN]\nsubjectAltName=DNS:${1}"\
        )\
     ) >"${1}.csr"
}

key $1
csr $1

Angewendet habe ich das Hilfsskript so:

  • Beide Funktionen in ein geöffnetes BASH-Fenster reinkopiert
  • Keys für alle Services erzeugen:
1
2
3
4
key pag.support
    key ppnproxy.pag.support
    key internal.daemons-point.com
    key mail.daemons-point.com
  • CSRs für alle Services erzeugen:
1
2
3
4
csr pag.support
    csr ppnproxy.pag.support
    csr internal.daemons-point.com
    csr mail.daemons-point.com
  • Auf die richtigen Rechner kopieren:
    • {ppnproxy.,}pag.support.{csr,key} –> Rechner “pag.support”
    • {internal.,mail.}daemons-point.com.{csr,key} –> Rechner “internal.daemons-point.com”
  • Erneuerungsskript: renew.sh … auch auf die Rechner kopieren

pag.support

Neue Dateien:

  • renew.sh: Neues Skript
  • /etc/apache2/ssl.letsencrypt/pag.support.crt
  • /etc/apache2/ssl.letsencrypt/ppnproxy.pag.support.crt
  • /etc/apache2/ssl.letsencrypt/private/pag.support.key
  • /etc/apache2/ssl.letsencrypt/private/ppnproxy.pag.support.key
  • /var/www/acme-certificates/pag.support.crt
  • /var/www/acme-certificates/ppnproxy.pag.support.crt

Geänderte Dateien:

  • /etc/crontab: Neues Skript eintragen für pag.support und ppnproxy.pag.support
  • /etc/sudoers: ApacheHTTPD durchstarten via “systemctl”
  • /etc/apache2/sites-available/https_pag.support.conf: Pfad zum CRT und KEY angepasst
  • /etc/apache2/sites-available/https_ppnproxy.pag.support.conf: Pfad zum CRT und KEY angepasst

Gelöschte Dateien:

  • renew-cert.sh: Altes Skript, löschen!
  • acme_tiny.py
  • domain.csr
  • domain-san-20191031.csr
  • domain-san.csr
  • intermediate.pem
  • /etc/apache2/sites-available/https_sysmt.pag.support.conf: Auch mit “a2dissite” deaktivieren!
  • /etc/apache2/sites-available/http_sysmt.pag.support.conf: Auch mit “a2dissite” deaktivieren!
  • /etc/apache2/ssl.letsencrypt/chained-san.pem
  • /etc/apache2/ssl.letsencrypt/private/domain.key
  • /var/www/acme-certificates/chained-san.pem

internal.daemons-point.com

Ignorieren wir erstmal, da hier die LetsEncrypt-Zertifikate aktuell nicht verwendet werden!

Änderungen

  • 2020-05-09: Erste Version