Lets Encrypt Zertifikat zum FreeRADIUS-Dienst im logosrv übertragen
Im Zuge der stärkeren Verbreitung von Android 11 (oder neuer) und des WPA3-Standards ist es nötig, bei RADIUS-gesicherten WLAN-Netzen sauber signierte SSL-Zertifikate am RADIUS-Server einzusetzen, damit die Clients eine Verbindung herstellen können.
Daher wurde ab Puppet-Version 1.5.0 die Möglichkeit implementiert, ein ausgewähltes Let's Encrypt Zertifikat zum FreeRADIUS-Dienst im logosrv zu übertragen. Folgende Anpassungen sind dazu nötig.
Nötige Konfigurationsschritte
1. [im puppeteer] Neues Let's Encrypt SSL-Zertifikat per acmetool oder acme.sh beantragen, hierfür einen geeigneten Namen verwenden (z.B. wlan.ShortName.logoip.de oder radius.ShortName.logoip.de). Danach 2x prun ausführen.
2. [im puppeteer] Folgenden Inhalt in die YAML-Datei /etc/logodidact/hiera/custom.d/ldhost.yaml eintragen bzw. ergänzen (ShortName entsprechend im Codeblock anpassen)
ld_legacy::radius::ensure: true
ld_legacy::radius::cn: 'wlan.ShortName.logoip.de'
3. [im ldhost] prun ausführen zum Übertragen der Zertifikate
4. [im logosrv] Konfigurationsdatei des FreeRADIUS-Dienst bearbeiten und darin die Let's Encrypt Zertifikate verknüpfen (einmalige Anpassung, muss manuell vorgenommen werden)
In der vorhandenen Config-Datei /etc/freeradius/eap.conf die entsprechenden drei Parameter anpassen (rot markierte Zeilen)
tls {
private_key_file = ${certdir}/wlan.ShortName.logoip.de.key # ShortName entsprechend anpassen
certificate_file = ${certdir}/wlan.ShortName.logoip.de.crt # ShortName entsprechend anpassen
# If CA_file (below) is not used, then the certificate_file below
# MUST include not only the server certificate, but ALSO all of
# the CA certificates used to sign the server certificate.
#CA_file = ${cadir}/ca.pem # diese Zeile auskommentieren
}
Danach den FreeRADIUS-Dienst mit dem Kommando /etc/init.d/freeradius restart neustarten.
Kompatibilität mit Android-Geräten steigern
Zur Steigerung der Kompatibilität mit Android 11 / 12 Geräten kann man ein Let's Encrypt Zertifikat per acme.sh Tool beantragen, welches nicht durch zwei Zertifizierungsstellen "cross-signed" wurde.
Dafür muss das Zertifikat mit besonderen Optionen beantragt werden. Hierfür zunächst wie üblich zum LXC-Container puppeteer verbinden und über den Befehl sle zum Benutzer le-acme wechseln. Jetzt jedoch nicht auf das bekannte Kommando issue [domain] für die Beantragung zurückgreifen, sondern stattdessen folgende beiden Kommandos verwenden (entscheidend sind die beiden Optionen in der letzten Zeile):
acme.sh --issue -d "$DOMAIN" -w "/var/www" --fullchain-file "/data/le/certs/$DOMAIN.crt" \
--key-file "/data/le/certs/$DOMAIN.key" --post-hook "/usr/share/acme.sh/fix-perm" --renew-hook "/usr/share/acme.sh/fix-perm" \
--preferred-chain "ISRG Root X1" --force
Nachfolgend ein Vergleich des Zertifikats mit der speziell selektierten Zertifizierungsstelle "ISRG Root X1" im Vergleich zum gewöhnlichen Let's Encrypt Zertifikat.
- Das neue LE-Zertifikat (oberer Teil der Abbildung, Path #1) würde von einem Android-Gerät akzeptiert werden.
- Das Standard LE-Zertifikat (unterer Teil der Abbildung, Path #2) entspricht der ursprünglichen Variante, ohne Anpassung (und gemäß des CA-Datums nicht mehr gültig).
root@puppeteer:~ $ cat /data/le/acme.sh/certs/wlan.ShortName.logoip.de/wlan.ShortName.logoip.de.conf
#[...]
Le_Preferred_Chain='__ACME_BASE64__START_SVNSRyBSb290IFgx__ACME_BASE64__END_'
# Hinweis: der eingespeicherte Base64-kodierte Wert entspricht hier "ISRG Root X1"
root@puppeteer:~ $ echo -n "ISRG Root X1" | base64
SVNSRyBSb290IFgx
Ab Version 3.0.1 des Tools acme.sh kann die bevorzugte Zertifizierungsstelle auch als feste Voreinstellung eingespeichert werden. Dazu im Kontext des Benutzers le-acme folgende Konfigurationsdatei anpassen:
root@puppeteer:~ $ sle
le-acme@puppeteer:~ $ vim ~/config/ca/acme-v02.api.letsencrypt.org/directory/ca.conf
# Folgende Zeile in zur Konfigurationsdatei hinzufügen zur Verwendung der CA "ISRG Root X1" für alle künftigen Let's Encrypt Zertifikate
DEFAULT_PREFERRED_CHAIN='ISRG Root X1'