- Mitglied seit
- 10. Jan 2016
- Beiträge
- 163
- Punkte für Reaktionen
- 27
- Punkte
- 28
Hallo Zusammen,
ich habe Zuhause eine DS mit Synology Drive Server und eine Raspi die als Reverse-Proxy fungiert. Da die DS nicht mehr direkt hinter dem Router hängt, sonder die Raspi dazwischen ist, kann ich auf der DS keine LetsEncypt Zertifikate holen bzw. updaten.
Deshalb habe ich folgende Konfiguration:
1. Die Raspi fungiert als Reverse-Proxy und holt die Zertifikate von LetsEncypt
2. Sobald ein Update vorliegt, werden die Zertifikate von der Raspi auf die DS automatisch kopiert
3. Die DS schaut täglich nach ob das von der Raspi kopierte Zertifikat neuer ist als das vorhanden und kopiert es entsprechend in die DS-Verzeichnisse
4. Das skipt startet ebenfalls automatisch den Webserver der DS, damit die Zertifikate in der DS aktualisiert werden.
Folgendes Problem habe ich:
- Wenn ein neues Zertifikat vorliegt schein die DS es zu übernehmen
- In der DS-Oberfläche (Systemsteuerung - Sicherheit - Zertifikate) wird das Ablaufdatum geupdatet
- Drive Client auf iOS und in der Weboberfläche (Firefox, Safari) zeigt auch ein geupdates Zertifikat an
- Leider macht aber der Win10 Client und der MacOS Client probleme und schmeisst beim sync die Fehlermeldung, dass das Zertifikat nicht gültig ist
- Ich muss immer in die DS-Oberfläche und über Systemsteuerung - Sicherheit - Zertifikate - Konfiguration - Dienst - Synology Drive Server das Zertifikat einmal abwählen neu wählen und mit OK bestätigen.
- Bei den anderen Diensten (Webbasiert) läuft alles wie es soll automatisch ohne erneue manuelle bestätigung
- Die DS ist nachts Aus und startet jeden Morgen neu, sodass auch das Neustarten des Synology Drive Servers definitiv sichergestellt ist mit den neuen Zertifikaten
Frage:
- Warum geht es nicht automatisch, habe ich im Skipt was übersehen ?
Das Skript habe ich hier aus dem Forum und habe es auf meine Bedürfnisse erweitert und macht im groben folgendes:
1. Das Skipt bekommt aus übergabeparameter den namen des Zertifikates (z.b: drive.domain.de)
2. Es schau in einem share verzeichnis ob ein Zertifikat vorliegt
3. Bildet einen Prüfsumme und vergleicht es mit der alten (vom alten Zertifikat)
4. Wenn Prüfsumme sich geändert hat, dann wird auf der Syno in der Info-Datei das cryptische Verzeichnis für die Zertifikate gesucht
5. Wenn Suche erfolgreich, werden die neuen Zertifikate da rein kopiert und der Webserver der Syno reloaded, damit die Zertifikate übernommen werden
ich habe Zuhause eine DS mit Synology Drive Server und eine Raspi die als Reverse-Proxy fungiert. Da die DS nicht mehr direkt hinter dem Router hängt, sonder die Raspi dazwischen ist, kann ich auf der DS keine LetsEncypt Zertifikate holen bzw. updaten.
Deshalb habe ich folgende Konfiguration:
1. Die Raspi fungiert als Reverse-Proxy und holt die Zertifikate von LetsEncypt
2. Sobald ein Update vorliegt, werden die Zertifikate von der Raspi auf die DS automatisch kopiert
3. Die DS schaut täglich nach ob das von der Raspi kopierte Zertifikat neuer ist als das vorhanden und kopiert es entsprechend in die DS-Verzeichnisse
4. Das skipt startet ebenfalls automatisch den Webserver der DS, damit die Zertifikate in der DS aktualisiert werden.
Folgendes Problem habe ich:
- Wenn ein neues Zertifikat vorliegt schein die DS es zu übernehmen
- In der DS-Oberfläche (Systemsteuerung - Sicherheit - Zertifikate) wird das Ablaufdatum geupdatet
- Drive Client auf iOS und in der Weboberfläche (Firefox, Safari) zeigt auch ein geupdates Zertifikat an
- Leider macht aber der Win10 Client und der MacOS Client probleme und schmeisst beim sync die Fehlermeldung, dass das Zertifikat nicht gültig ist
- Ich muss immer in die DS-Oberfläche und über Systemsteuerung - Sicherheit - Zertifikate - Konfiguration - Dienst - Synology Drive Server das Zertifikat einmal abwählen neu wählen und mit OK bestätigen.
- Bei den anderen Diensten (Webbasiert) läuft alles wie es soll automatisch ohne erneue manuelle bestätigung
- Die DS ist nachts Aus und startet jeden Morgen neu, sodass auch das Neustarten des Synology Drive Servers definitiv sichergestellt ist mit den neuen Zertifikaten
Frage:
- Warum geht es nicht automatisch, habe ich im Skipt was übersehen ?
Das Skript habe ich hier aus dem Forum und habe es auf meine Bedürfnisse erweitert und macht im groben folgendes:
1. Das Skipt bekommt aus übergabeparameter den namen des Zertifikates (z.b: drive.domain.de)
2. Es schau in einem share verzeichnis ob ein Zertifikat vorliegt
3. Bildet einen Prüfsumme und vergleicht es mit der alten (vom alten Zertifikat)
4. Wenn Prüfsumme sich geändert hat, dann wird auf der Syno in der Info-Datei das cryptische Verzeichnis für die Zertifikate gesucht
5. Wenn Suche erfolgreich, werden die neuen Zertifikate da rein kopiert und der Webserver der Syno reloaded, damit die Zertifikate übernommen werden
Bash:
#!/bin/bash
# Speichern des Arguments (Uebergabeparameter, Such string fuer die Description)
# Suchbegriff sollte die domain des Zertifikates haben, z.b. drive.domain.de
# Dieser Suchbegriff wird benoetigt um in der Synology-Struktur das Zertifikat zu finden
# Ändern des Zertifikatnamens (Systemsteuerung -> Sicherheit -> Zertifikate -> Bearbeiten)
#searchTargetCert=$1
OriginCertName=$1
# Definition der verwendeten Dateien / Dateipfade
# Quellpfade der Zertifikate (z.B. vom Rasberry Pi oder einem anderen Server der die Zertifikate von letsencrypt holt)
OriginRenewedCertPath=/volume1/RasPi_Share/ssl_certificate
# Erweiterte Logs (aktivieren - 1 / deaktivieren - 0)
extendDebugMsg=0
# Zielpfad fuer die Zertifikate auf der Synology
# z.b. DSM6: /usr/syno/etc/certificate/_archive (typisch der pfad zur INFO datei)
TargetCertRootPath=/usr/syno/etc/certificate/_archive
TargetCertInfoFile=/usr/syno/etc/certificate/_archive/INFO
################ Ab hier nicht mehr aendern #################
########################################################
# Initialisiere Skriptergebnis zum debuggen
result=10
# Initialisiere die Quell- und Zielverzeichnisse sowie Backupverzeichnis
OriginCertPath=$OriginRenewedCertPath/$OriginCertName
OriginCertFile=$OriginCertPath/cert.pem
TargetCertPathBackup=$OriginCertPath/backup
TargetCertFile=""
OriginCertHash=""
TargetCertHash=""
# Pruefen ob eine neue Zertifikatsdatei an dem Quellort vorhanden ist
# Wenn ja, dann erstelle von dieser Datei eine Checksumme (MD5)
# die berechnete Checksumme wird zwischengespeichert
if [ -f $OriginCertFile ]; then
OriginCertHash=`openssl dgst -md5 $OriginCertFile | egrep -o [0-9a-zA-Z]{32}`
echo "OK: Origin-Cert found in: ${OriginCertFile}"
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Hash of Origin-Cert: ${OriginCertHash}"
fi
else
echo "NOK: Origin-Cert ${OriginCertFile} not found"
result=1
fi
# Zertifikat auf der Synology suchen mit Hilfe des Suchbegriffs unterhalb des Ortes: TargetCertRootPath
# Hier wird nun der Speicherort fuer das Zertifikat anhand dessen Beschreibung ermittelt
# Ändern des Zertifikatnamens (Systemsteuerung -> Sicherheit -> Zertifikate -> Bearbeiten)
if [ ! -z "$OriginCertName" ]; then
for randomFolderName in `grep -i -B 1 '"desc"' $TargetCertInfoFile | grep -Eo '"([a-zA-Z0-9]{6})"' | sed 's/"//g'`; do
description=`grep -i -A 1 "$randomFolderName" $TargetCertInfoFile | grep -Eo '"desc" : "(.+)"' | sed 's/"desc" : //g' | sed 's/"//g'`
# Es wurde ein Verzeichnis zum jeweiligen Argument (Description) gefunden
if [ "$OriginCertName" == "$description" ]; then
TargetCertFile=${TargetCertRootPath}/${randomFolderName}/cert.pem
TargetCertPath=${TargetCertRootPath}/${randomFolderName}
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Target-Cert ${OriginCertName} found in ${TargetCertFile}"
fi
result=0
fi
done
else
echo "NOK: Please enter the Target-Cert name as parameter (e.g. bash myUpdateCert.sh drive.domain.de)"
result=1;
exit $result
fi
# Wenn anhand des Suchbegriffs kein Zertifikat auf der Syno gefunden wird, Fehler und Abbruch
if [ ! -z "$TargetCertFile" ]; then
# Pruefen ob eine neue Zertifikatsdatei an dem Quellort vorhanden ist
# Wenn ja, dann erstelle von dieser Datei eine Checksumme (MD5)
# die berechnete Checksumme wird zwischengespeichert
if [ -f $TargetCertFile ]; then
TargetCertHash=`openssl dgst -md5 $TargetCertFile | egrep -o [0-9a-zA-Z]{32}`
echo "OK: Target-Cert found in: ${TargetCertFile}"
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Hash of Target-Cert: ${TargetCertHash}"
fi
else
echo "NOK: Target-Cert file not found: ${TargetCertFile}"
result=1
exit $result
fi
else
echo "NOK: Target-Cert ${OriginCertName} not found on Synology"
result=1
exit $result
fi
if [ ! -z "$TargetCertHash" ] && [ ! -z "$OriginCertHash" ]; then
echo "OK: Hash-Origin-Cert: ${OriginCertHash}"
echo "OK: Hash-Target-Cert: ${TargetCertHash}"
# Kopieren der Zertifikate, wenn die Check-Summe MD5 ungleich ist
if [ "$TargetCertHash" != "$OriginCertHash" ]; then
# 1. Backup der alten Zertifikate
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Backup from ${TargetCertPath} to ${TargetCertPathBackup} "
fi
if [ -d $TargetCertPathBackup ]; then
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Backup folder ${TargetCertPathBackup} found"
fi
echo "OK: Backup the old Target-Certs to ${TargetCertPathBackup}"
cp $TargetCertPath/*.pem $TargetCertPathBackup
else
mkdir $TargetCertPathBackup
echo "OK: Backup folder created ${TargetCertPathBackup}"
cp $TargetCertPath/*.pem $TargetCertPathBackup
fi
# 2. Kopieren der Zertifikate
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Copy from ${OriginCertPath} to ${TargetCertPath} "
fi
echo "OK: The Target-Cert was updated by the Origin-Cert"
cp $OriginCertPath/*.pem $TargetCertPath
echo "OK: nginx on restarted to activate updated certificates"
# 3. nginx Neustarten, damit zertifikate übernommen werden
synoservicectl --restart nginx
result=0
else
echo "OK: Origin-Cert and Target-Cert not changed"
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Hash-Origin-Cert: ${OriginCertHash}"
echo "DEBUG: Hash-Target-Cert: ${TargetCertHash}"
fi
result=0
fi
else
echo "NOK: Hash MD5 error"
if [ $extendDebugMsg == 1 ]; then
echo "DEBUG: Hash-Origin-Cert: ${OriginCertHash}"
echo "DEBUG: Hash-Target-Cert: ${TargetCertHash}"
fi
result=1
exit $result
fi
if [ $result == 10 ]; then
if [ $extendDebugMsg == 1 ]; then
echo "unexpected Error, activate Debug (ExtendDebugMSG = 1) and check the LogFiles"
fi
fi
exit $result