Drive Server / Drive Win10 Client probleme mit Zertifikaten

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
140
Punkte für Reaktionen
1
Punkte
18
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

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
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Nginx restart reicht nicht.

Ich weiß jetzt nicht, ob die Zertifikate noch weiter verteilt werden, oder wie das war. Nachdem diese unter _archive vorhanden sind nehme ich folgendes Reload Script. Hatte noch keine Probleme mit irgendeinem Dienst hinterher, auch nicht mit Drive

https://github.com/bartowl/synology-stuff/blob/master/reload-certs.sh
Gleiche Wirkung wie wenn du es unter Konfigurieren neu zuweist vermute ich.

Alternativ kannst auch mal Richtung acme.sh schauen, da gibt es direkt einen deploy hook für die Synology
https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-cert-into-synology-dsmSollten, wenn ich es verstehe auf der Syno gar keine Nacharbeiten fällig sein. Probiert habe ich es noch nicht.
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
140
Punkte für Reaktionen
1
Punkte
18
Moin Fusion,
super danke für die schnelle Antwort. Das ich kein so krasser Linux-Crack bin will ich noch mal sichergehen. Das erste Skript durchforstet automatisch die Info Datei, sucht alle Services für jedes einzelne Zertifikat raus und startet diese neu?

Reicht es wenn ich an die Stelle wie ich in meinem Skript den nginx Neustarts das von dir verlinkte Skript Aufrufe?
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Ich habe mir das Script nochmals angeschaut. Ich hatte damals noch eine fehlende Erkenntnis zu der Zertifikatsverteilung, sprich des Ablageorts.

In deinem Script Zeilen 19-22

Bash:
# 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

Als ich das Skript erstellt hatte war ich davon ausgegangen es gäbe nur ein Ablageort der Zertifikate der unterschiedlichen Dienste und Anwendungen.
Nämlich --> /usr/syno/etc/certificate/_archive

Schau dir einmal bitte den Beitrag #96 vom Thema "Lets Encrypt Wildcard Zertifikat (ACME v2)" an. Dort hatte mich @geimist daruf gebracht dass in der .._archive/INFO Datei die Unterscheidung von "isPkg" : true und "isPkg" : false gemacht wird.

Somit ist "SynologyDrive" auch mit "isPkg" :true definiert.
Alle Dienste die mit true definiert sind, dessen Verzeichnisse liegen an einem anderen Ort.
Nämlich unter --> /usr/local/etc/certificate/

Ich gehe stark davon aus, dass wenn das jeweilige Zertifikat an die richtige Stelle kopiert wurde alles sauber funktioniert.

D.h. nach dem Dispatchen des kryptischen Verzeichnisses wird das neue Zertifikat einmal unter diesem kryptischen Verzeichnis abgelegt
/usr/syno/etc/certificate/_archive/<xxxxxx>
und wenn es mit isPkg :true gekennzeichnet muss es zusätzlich unter
/usr/local/etc/certificate/<subscriber>/<service>
abgelegt werden.

Bei mir habe ich z.B. beide Verzeichnisse die für SynologyDrive verantwortlich sind verglichen.
Alle Zertifikatsdateien somit gleich.

root@HOST:~ $ diff -qr /usr/syno/etc/certificate/_archive/nkKHt3/ /usr/local/etc/certificate/SynologyDrive/SynologyDrive/
Only in /usr/syno/etc/certificate/_archive/nkKHt3/: renew.json
 
Zuletzt bearbeitet:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.137
Punkte für Reaktionen
898
Punkte
424
Ja, sollte reichen. @luddi hat es ja gerade nochmal ausgeführt.
Kannst also entweder inkludieren oder einfach danach ausführen wenn die Zertifikate in _archive abgelegt sind.
Sorgt dann auch nur dafür, dass alle Dienste mit ihren Zertifikaten versorgt werden.
Da es allgemein gehalten ist stört es auch nicht, wenn mal Dienste dazu kommen oder wegfallen.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.242
Punkte für Reaktionen
586
Punkte
174
Das velinkte Script "reload-certs.sh" von @Fusion macht genau das... die Zertifikate richtig zu verteilen.
@KGBist2000 D.h. wie Fusion bereits erwähnt hat kannst du nach der Ausführung deines eigenen Scripts das "reload-certs.sh" aufrufen und alles sollte gut sein.
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
140
Punkte für Reaktionen
1
Punkte
18
Hallo luddi, hallo Fusion,

super, danke. Habe es gerade eingebaut und manuell getestet. scheint zu funktionieren. Krass, wusste garnicht, dass die Syno die Zertifikate an unterschiedlichen Stellen speichert.

VG
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
140
Punkte für Reaktionen
1
Punkte
18
Hallo Zusammen,
mehrere Monate hat das updaten sauber der Zertifikate sauber funktiert mit dem Skript:
https://github.com/bartowl/synology-stuff/blob/master/reload-certs.sh

Ich glaube seit dem letzten Update vom DSM auf DSM 6.2.4-25556 Update 2, habe ich das Problem, dass für den Synology Drive Client (Win10 PC) das Zertifikat nicht automatisch durch das Skript nachgeladen wurde. Ich habe die im Skipt angezongen Ordner durchgeschaut und mir ist aufgefallen, dass unter:
reload=/usr/local/libexec/certificate.d/

nur LogCenter und ReplicationService ist, es fehlt aber SynologyDrive.

1634242012332.png

Unter SystemSteuerung -> Sicherheit -> Zertifikate ist alle korrekt gesetzt.

root@nas-ds:/usr/syno/etc/certificate/_archive# cat INFO
1634242361017.png
In der INFO Datei ist auch alles soweit korrekt aus meiner Sicht.

Könnt ihr mir auf die Sprünge helfen, warum unter:
/usr/local/libexec/certificate.d/ : SynologyDrive fehlt ?
 
Zuletzt bearbeitet:

DrDeath

Benutzer
Mitglied seit
31. Aug 2018
Beiträge
193
Punkte für Reaktionen
79
Punkte
34
Das Script funktioniert nicht mehr, weil es an den angegebenen Datei Pfaden keine "cert.pem" mehr finden kann.

Code:
[...]
diff: /usr/local/etc/certificate/WebStation/vhost_63ef378c-b65c-46dd-8a9f-cd521265379c/cert.pem: No such file or directory
* updating certificate for XXXXXXX.XXXXXX.XX:80
/443
  reloading...
diff: /usr/local/etc/certificate/WebStation/vhost_986646b1-d818-463b-b304-827cfa6d5816/cert.pem: No such file or directory
* updating certificate for YYYYY.XXXXXXX.XXXXXX.XX:80
/443
  reloading...

Das kommt daher, da die Zertifikate nicht mehr als "cert.pem" abgelegt werden, sondern als "ECC-cert.pem" und "RSA-cert.pem".

Du musst nur das Script entsprechend anpassen.

Erstetze alle "cert.pem" mit "ECC-cert.pem" ( ohne Anführungszeichen natürlich )
bzw. auch alle Vorkommnisse von:
"chain.pem" --> "ECC-chain.pem"
"fullchain.pem" --> "ECC-fullchain.pem"
"privkey.pem" --> "ECC-privkey.pem"


Ich bin mir aber nicht sicher, ob man auch die "RSA-cert.pem" usw. benötigt.

Die ganze Umbenennerei hat sich seit dem letzten oder vorletzten Update ergeben.

Siehe dazu auch:
https://www.synology-forum.de/threa...ler-mehrere-pakete-starten-nicht-mehr.115968/
 
Zuletzt bearbeitet:


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat