Letsencrypt auf Client hinter reverse Proxy von Diskstation

Status
Für weitere Antworten geschlossen.

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi das mit dem skript wäre super.
1. der Raspberry erstellt und erneuert die Zertifikate.
2. die Zertifikate werden direkt in ein Verzeichnis auf der DS geschrieben.
3. Auch nach dem Erneuern erfolgt das Schreiben in das NFS-Verzeichnis welches sich auf der DS befindet.

Okay prima. Und danke nochmals für die vielen Details zur Cert Erstellung mittels acme. Das werde ich definitv ausprobieren.

Wie sieht dann Punkt 4. in deinem Workflow aus?
Kopierst du aktuell die erneuerten Zertifikate manuell an die entsprechende Stelle wo sie die Diskstation erwartet werden oder erneuerst du die Certs über die DSM GUI?

Genau diesen Punkt 4. können wir automatisieren...

Ich habe da auch schon ein Grundgerüst für ein bash Script.
Du kannst es dir gerne einmal im Detail ansehen und Anhand eines Bespiels testen.

Hier das Script, die Details sind im Code erklärt.

Ich habe dem Kind folgenden Namen gegeben: check-new-cert.bash
Erstelle dir zunächst in einem Verzeichnis deiner Wahl einen test Ordner (in meinem Script Beispiel direkt im home Verzeichnis ~/test ) und passe die Pfade für die Variablen (orange und grün) entsprechend an.
Ertelle darin die Datei Cert.txt, kann leer sein oder irgendeinen sinnlosen Inhalt vorhalten.

Also sollten sich in deinem test Ordner nur das script selbst und die Cert.txt Datei befinden.
Die grün markierten Dateien werden vom Script erstellt und werden für den Checksummenvergleich herangezogen.

Für den Test noch nicht relevant, aber der blaue Teil ist derjenige der später noch zu befüllen ist. Aber zunächst kümmern wir uns um den Test selbst.

Lasst euch nicht verwirren, es ist mehr Kommentar als Code selbst ;)
Rich (BBCode):
#!/bin/bash

# Definition der verwendeten Dateien
CertFile=~/test/Cert.txt
HashFileCurrent=~/test/hash-current.txt
HashFileTemp=~/test/hash-temp.txt

# Prüfen ob die Zertifikatsdatei an dem angebenen Ort vorhanden ist
# Wenn ja, dann erstelelle von dieser Datei eine CSUM (in diesem Beispiel eine MD5)
# und schreibe die Checksumme anschließend in die Datei welche unter der Variable $HashFileTemp definiert wurde.
if [ -f $CertFile ]; then
  hashmd5=`openssl dgst -md5 $CertFile | egrep -o [0-9a-zA-Z]{32}`
  echo $hashmd5 > $HashFileTemp # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
fi

# Prüfen ob bereits eine aktuelle Checksumme zur Zertifikatsdatei existiert. Somit wird überprüft ob die Datei welche in der
# Variable $HashFileCurrent definiert wurde vorhanden ist.
# Wenn somit beide Datein vorhanden sind, welche zum einen die aktuelle Checksumme und die Checksumme die zur Überprüfung
# herangezogen wird existieren sprich $HashFileCurrent UND $HashFileTemp dann prüfe auf einen Unterschied und vergleiche.
if [ -f $HashFileCurrent ] && [ -f $HashFileTemp ]; then
  diffresult=`diff $HashFileCurrent $HashFileTemp`
   
  # Jetzt wird überprüft ob das Resultat des Vergleichs nicht leer ist, sprich beide Checksummen sich unterscheiden.
  # Dann wird die gegenwärtige aktuelle Checksumme mit der neu genierten überschrieben und abgelegt.
  # Dies hat zur Forlge, dass die Checksumme welche in der Datei abgelegt ist wieder zur gegenwärtigen Cert-Datei passt.
  if [ ! -z "$diffresult" ]; then
    echo Checksumme hat sich geändert! # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
    echo Alte CSUM: `cat $HashFileCurrent` # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
    echo Neue CSUM: `cat $HashFileTemp` # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
    mv $HashFileTemp $HashFileCurrent
    ####################################################################################
    #
    # ToDo:
    # Dies ist der Teil bzw. Sektion wo die gewünschten Aktionen
    # ausgeführt werden. In diesem Fall, das Kopieren der verfügbaren
    # und erneuerten Cert Dateien an die entsprechende Stelle der Diskstation
    #
    ####################################################################################
  
  # In dem Fall dass sich die Checksummen nicht unterscheiden, sprich die Variable des results "leer" ist
  # soll lediglich die temporär ertellte Checksummen Datei entfernt werden.
  else
    echo Keine Änderung! # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
    rm $HashFileTemp
  fi

# Wenn zu Beginn, also bei der ersten Ausführung des Scripts noch keine aktulle Checksummen Datei zum Vergleich existiert
# dann lege diese anhand der aktuell erstellen CSUM ab. Umbenennen der temporären Datei in die aktuell gültige.
else
  if [ -f $HashFileTemp ]; then
    echo Initial: Noch kein CSUM Vergleich möglich. # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
    mv $HashFileTemp $HashFileCurrent
  fi
fi

exit 0


Wenn alle Vorbereitungen getroffen sind, dann musst du das Script File noch ausführbar machen --> "chmod +x ~/test/check-new-cert.bash"
Dann wird das Script ausgeführt...

Rich (BBCode):
~/test/check-new-cert.bash

a.) Die erste Ausgabe sollte lauten:
> Initial: Noch kein CSUM Vergleich möglich.

b.) Führst man das Script ein zweites mal aus sollte folgende Ausgabe erscheinen:
> Keine Änderung!

c.) nun ändert man den Inhalt der Datei "Csum.txt" und fürht das Script anschließend erneut aus. Ausgabe entsprechend:
> Checksumme hat sich geändert!
> Alte CSUM: 76f17c5e0c0d27ca39e67d6d0b2dbea6
> Neue CSUM: 732d91367e617cfa7369481b180227f2

d.) das Script erneut ausführen ohne eine Änderung an der Datei vorzunehmen ergibt folglich:
> Keine Änderung!

Der blaue Teil der noch befüllt werden muss schauen wir uns im Nachhinein an.
Die Synology Diskstation speichert und verwaltet ihre Zertifikate an folgendem Ort:
/usr/syno/etc/certificate/_archive

Darin befinden sich für jedes Zertifikat ein kryptisches Unterverzeichnis welches über folgende Datei aufgeschlüsselt wird und zugeordnet werden kann.
Die Datei "INFO" --> also /usr/syno/etc/certificate/_archive/INFO

Ein Auszug zeigt zum Beispiel folgenden Inhalt:
Rich (BBCode):
   },
   "R1EdUK" : {
      "desc" : "Name des Zertifikats",
      "services" : [
         {
            "display_name" : "sub.domain.tld",
            "isPkg" : false,
            "owner" : "root",
            "service" : "FQDN",
            "subscriber" : "system"
         }
      ]
   },

Somit liegen die Zertifikate für die Domain aus diesem Beispiel sub.domain.tld unter folgendem Verzeichnis /usr/syno/etc/certificate/_archive/R1EdUK
D.h. man muss in der blau markierten Sektion das Kopiren der jeweiligen Zertifikate richtig den kryptischen Verzeichnissen zuordnen.
Für den Anfang kann man dies händisch für jede Domain heraussuchen und in das Script eintragen und verwenden. Das kryptisch erstellte Verzeichnis behält seinen Namen solange man das Cert nicht aus dem Cert Manager löscht und neu anlegt. Hier könnte man sich für später auch überlegen, die Zuordnung zur jeweiligen Domain passen zum kryptischen Verzeichnis per Script herauszusuchen.

Ich weiß aktuell nicht wie die Synology Diskstation die Certs neu einliest... Ich bin mir nicht sicher ob es ausreicht die Dateien an die besagte Stelle zu kopieren oder ob ein Reload bzw. Restart des Webservers notwendig ist.

--luddi
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi,
Aktuell erneuere ich händisch via DSM GUI. Das Skript schaue ich mir morgen oder am Freitag mal an, auch wenn mir die Farben nicht helfen ;-).

Viele Grüße und dir auch viel Spaß beim Testen
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi,
[...] auch wenn mir die Farben nicht helfen ;-).
entschuldige bitte. Ich hatte nicht daran gedacht obwohl mir deine Situation bereits bekannt ist. Ich hoffe die Farben helfen jedoch anderen Lesern hier im Forum.

Schöne Grüße und vielen Dank. Dir auch viel Erfolg und Spass beim ausprobieren.

--luddi
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Entschuldige dich bitte nicht dafür. Ich bin hier ja nicht alleine unterwegs. ;-)
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi,

dein Skript funktioniert wie geplant.

Ich gehe fest davon aus, dass der webserver neu gestartet wird.
synoservicectl --restart nginx
Die Frage, die sich mir stellt, wenn ich das Zertifikat als Standard ausgewählt habe, greifen dann andere Anwendungen auch auf diesen Pfad zu?

Edit: Das Cert wird nach dem synoservicectl --restart nginx auch für die Pakete getauscht. hab eben mal eines umbenannt und den reload durchgeführt.
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi,

das ist schon einmal gut wenn das Skript tut was es soll.
Die Frage, die sich mir stellt, wenn ich das Zertifikat als Standard ausgewählt habe, greifen dann andere Anwendungen auch auf diesen Pfad zu?

Das Standard Zertifikat verwaltet natürlich mehrere Anwendungen wie du richtig bemerkt hast.

Edit: Das Cert wird nach dem synoservicectl --restart nginx auch für die Pakete getauscht. hab eben mal eines umbenannt und den reload durchgeführt.
Das ist prima, davon kann ich dann auch gebrauch machen. Danke dir! :)



Werfen wir einen Blick auf das Standardzertifikat...
Hier z.B. der Auszug aus meiner INFO Datei. Hier sieht man eine Sammlung von Anwendungen die allein von dem Standard Zertifikat verwaltet werden.

Rich (BBCode):
"nkKHt3" : {
      "desc" : "Default Cert",
      "services" : [
         {
            "display_name" : "CardDAVServer",
            "display_name_i18n" : "SYNO.SDS.CardDAVServer.Instance:app:app_name",
            "isPkg" : true,
            "owner" : "CardDAV",
            "service" : "carddav",
            "subscriber" : "CardDAVServer"
         },
         {
            "display_name" : "WebDAVServer",
            "display_name_i18n" : "SYNO.SDS.WebDAVServer.Instance:app:app_name",
            "isPkg" : true,
            "owner" : "root",
            "service" : "webdav",
            "subscriber" : "WebDAVServer"
         },
         {
            "display_name" : "Replication Service",
            "display_name_i18n" : "app:displayname",
            "isPkg" : true,
            "owner" : "root",
            "service" : "snapshot_receiver",
            "subscriber" : "ReplicationService"
         },

Wie man sehen kann würde in meinem Beispiel das Random generierte Verzeichnis "nkKHt3" für das "Default Cert" Standart Zertifikat als Ablageort dienen.
Den Namen (also die Beschreibung) die man hier unter dem tag "desc" für Description findet, ist derjenige der im Zertifikatsmanager in der DSM GUI angegeben werden kann explizit zu jedem einzelnen Zertifikat.
Nun sieht man in meinem Beispiel, dass das Standardzertifikat für mehrere Services (Applikationen) zuständig ist. Der Abschnitt für die Sammlung aller Applikationen beginnt mit dem tag "services".

Nun habe ich bereits ein weiteres Skript Schnipsel vorbereitet. Mit diesem ist es möglich nach einer Description in der INFO Datei zu suchen und als Ergebnis den gesuchten Ordner bzw. den Speicherort für das jeweilige Zertifikat auszugeben.

Hier das Script "search-desc-get-path.bash"

Rich (BBCode):
#!/bin/bash

searchPatternDesc=$1
InfoFile=INFO
CertRootPath=/usr/syno/etc/certificate/_archive
result=1

if [ ! -z "$searchPatternDesc" ]; then

  for randomFolderName in `grep -i -B 1 '"desc"' $InfoFile | grep -Eo '"([a-zA-Z0-9]{6})"' | sed 's/"//g'`; do
    description=`grep -i -A 1 "$randomFolderName" $InfoFile | grep -Eo '"desc" : "(.+)"' | sed 's/"desc" : //g' | sed 's/"//g'`
  
    if [ "$searchPatternDesc" == "$description" ]; then
      echo Random Folder Found: $randomFolderName
      echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
      result=0
    fi
  done

  if [ $result -eq 1 ]; then
    echo Description not found...
  fi

else
   echo No Search String given!
fi

exit 0

Das Skript kann an einem beliebigen Speicherort abgelegt werden weil hier in diesem Beispiel absolute Pfade verwendet werden (Pfad zum INFO File und die Wurzel der Zertifikate, Zeile 4 u. 5).
Im allgemeinen bin ich eher ein Freund von Pfadunabhägigen Skripten, aber für dieses Beispiel aktuell vollkommen i.O. Ich bevorzuge für jeden Pfad der benötigt wird ein Argument als Übergabeparameter.

Nun zur Ausführung...
Das Skript erwartet ein Argument welches der String ist, nachdem gesucht werden soll.
Zurück zu meinem Beispiel mit dem Standard Zertifikat. Hier möchte man nach der Description "Default Cert" suchen.
Beim Aufruf des Skripts bei Argumenten mit Leerzeichen aufpassen!

Rich (BBCode):
1.) Skript ausführen

  a.) Option A mit Double Quotes wegen dem Leerzeichen

  <pfad-zum-skript>/search-desc-get-path.bash "Default Cert"

  b.) Option B Leerzeichen mit backslash escaped

  <pfad-zum-skript>/search-desc-get-path.bash Default\ Cert

2.) Folgendes Ergebnis wird ausgegeben
> Random Folder Found: nkKHt3
> Cert Path for the searched description is: /usr/syno/etc/certificate/_archive/nkKHt3

3.) Wird kein Argument übergeben so wird dies mit einer Meldung abgefangen
> No Search String given!


Ich hoffe du kannst auch dieses Skript in deiner Umgebung erfolgreich ausführen.
Du solltest als Resultat auch das passende Verzeichnis zu deinem Standardzertifikat bekommen.

Der Vorteil hierin ist, dass man das kryptisch generierte Verzeichnis nicht kennen muss selbst wenn das Zertifikat gelöscht und neu angelegt wird. Man muss lediglich den Namen der Beschreibung verwenden den man im Zertifikatmanager angegeben hat.

Schöne Grüße
luddi
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi, die ausführung ist leider nicht erfolgreich:
sh search-desc-get-path.bash "wildcard"
grep: INFO: No such file or directory
Description not found...

die Beschreibung des Zertifikates ist wildcard.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hallo blinddark,

sorry das war mein Fehler als ich das Skript hier eingefügt hatte. Ich hatte es parrallel noch einer anderen Maschine getestet wo die INFO Datei in dem Verzeichnis lag von wo aus ich das Script ausgeführt habe.
grep: INFO: No such file or directory

Er kann in deinem Falle die Datei INFO nicht finden.
Bitte korrigiere die Zeile Nr. 4

Rich (BBCode):
InfoFile=INFO

---> bitte ändern sodass der Pfad auf der Diskstation zur INFO Datei korrekt ist.
InfoFile=/usr/syno/etc/certificate/_archive/INFO

--luddi
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
du warst schneller. hab ich eben getan und es funktioniert wie gewünscht.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Perfekt! :)

Jetzt kannst du beide Scripte vereinen. Entweder du übernimmst den Code Anteil in das erste Skript oder du rufst das zweite Skript direkt aus dem ersten auf.

In dem zweiten Skript kannst du auch gleich den Copy Befehl einbauen von dem erneuerten Zertifikat.
Natürlich alle echo´s herausnehmen bzw. als Kommentar kennzeichnen.

Hier das Beispiel:

Rich (BBCode):
13     if [ "$searchPatternDesc" == "$description" ]; then
14       echo Random Folder Found: $randomFolderName
15       echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
16       TargetPath=$CertRootPath/$randomFolderName
17       # cp $OriginRenewedCertPath/* $TargetPath
18       result=0
19     fi

In Zeile #17 erstellt man eine Variable mit dem Zielverzeichnis und hier noch als Kommentar in Zeile #18 der copy Befehl der alle Dateien des Quellverzeichnis zum Ziel kopiert. Die Variable $OriginRenewedCertPath in meinem Beispiel kannst du dir auch ganz oben zu Beginn des Skript definieren. Diese sollte natürlich das Qeullverzeichnis beinhalten wo die ereneurten Zertifikate liegen.

Und vielleicht nicht zu vergessen, auch gleich den Befehl für den Restart des Webservers direkt nach dem Kopiervorgang einbauen.
So wie du es bereits vorgeschlagen hast mit "synoservicectl --restart nginx"

--luddi
 
Zuletzt bearbeitet:

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi,

in etwa so?
code:
#!/bin/bash


# Definition der verwendeten Dateien


CertFile=$OriginRenewedCertPath/*.pem
HashFileCurrent=$OriginRenewedCertPath/hash-current.txt
HashFileTemp=$OriginRenewedCertPath/hash-temp.txt
searchPatternDesc=$1
InfoFile=/usr/syno/etc/certificate/_archive/INFO
CertRootPath=/usr/syno/etc/certificate/_archive
OriginRenewedCertPath=/volume1/raspberry/acme/rsa


# Prüfen ob die Zertifikatsdatei an dem angebenen Ort vorhanden ist
# Wenn ja, dann erstelelle von dieser Datei eine CSUM (in diesem Beispiel eine MD5)
# und schreibe die Checksumme anschließend in die Datei welche unter der Variable $HashFileTemp definiert wurde.
if [ -f $CertFile ]; then
hashmd5=`openssl dgst -md5 $CertFile | egrep -o [0-9a-zA-Z]{32}`
# echo $hashmd5 > $HashFileTemp # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
fi


# Prüfen ob bereits eine aktuelle Checksumme zur Zertifikatsdatei existiert. Somit wird überprüft ob die Datei welche in der
# Variable $HashFileCurrent definiert wurde vorhanden ist.
# Wenn somit beide Datein vorhanden sind, welche zum einen die aktuelle Checksumme und die Checksumme die zur Überprüfung
# herangezogen wird existieren sprich $HashFileCurrent UND $HashFileTemp dann prüfe auf einen Unterschied und vergleiche.
if [ -f $HashFileCurrent ] && [ -f $HashFileTemp ]; then
diffresult=`diff $HashFileCurrent $HashFileTemp`

# Jetzt wird überprüft ob das Resultat des Vergleichs nicht leer ist, sprich beide Checksummen sich unterscheiden.
# Dann wird die gegenwärtige aktuelle Checksumme mit der neu generierten überschrieben und abgelegt.
# Dies hat zur Folge, dass die Checksumme welche in der Datei abgelegt ist wieder zur gegenwärtigen Cert-Datei passt.
if [ ! -z "$diffresult" ]; then
# echo Checksumme hat sich geändert! # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
# echo Alte CSUM: `cat $HashFileCurrent` # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
# echo Neue CSUM: `cat $HashFileTemp` # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
mv $HashFileTemp $HashFileCurrent
####################################################################################
result=1


if [ ! -z "$searchPatternDesc" ]; then

for randomFolderName in `grep -i -B 1 '"desc"' $InfoFile | grep -Eo '"([a-zA-Z0-9]{6})"' | sed 's/"//g'`; do
description=`grep -i -A 1 "$randomFolderName" $InfoFile | grep -Eo '"desc" : "(.+)"' | sed 's/"desc" : //g' | sed 's/"//g'`

if [ "$searchPatternDesc" == "$description" ]; then
# echo Random Folder Found: $randomFolderName
# echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
result=0
fi
done


if [ $result -eq 1 ]; then
# echo Description not found...
fi


else
# echo No Search String given!
fi


if [ "$searchPatternDesc" == "$description" ]; then
# echo Random Folder Found: $randomFolderName
# echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
TargetPath=$CertRootPath/$randomFolderName
cp $OriginRenewedCertPath/* $TargetPath
result=0
# restart nginx
synoservicectl --restart nginx
fi

####################################################################################

# In dem Fall dass sich die Checksummen nicht unterscheiden, sprich die Variable des results "leer" ist
# soll lediglich die temporär ertellte Checksummen Datei entfernt werden.
else
# echo Keine Änderung! # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
rm $HashFileTemp
fi

# Wenn zu Beginn, also bei der ersten Ausführung des Scripts noch keine aktulle Checksummen Datei zum Vergleich existiert
# dann lege diese anhand der aktuell erstellen CSUM ab. Umbenennen der temporären Datei in die aktuell gültige.
else
if [ -f $HashFileTemp ]; then
# echo Initial: Noch kein CSUM Vergleich möglich. # Die Ausgabe dient nur fürs debugging (kann später entfernt werden)
mv $HashFileTemp $HashFileCurrent
fi
fi
exit 0



Da muss ich nur in meinem Part für das Erstellen der Zertifikate die Namen anpassen, dass sie wie folgt heißen
chain.pem
cert.pem
fullchain.pem
privkey.pem


Mir ist eben noch etwas interessantes aufgefallen. Wenn ich bei der Syno den Import mit fullchain, cert und privkey starte, wird die cert.pem mit 2x dem gleichen Inhalt angelegt.
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi,

in etwa so?
code:
#!/bin/bash
# Definition der verwendeten Dateien

CertFile=$OriginRenewedCertPath/*.pem
HashFileCurrent=$OriginRenewedCertPath/hash-current.txt
HashFileTemp=$OriginRenewedCertPath/hash-temp.txt
searchPatternDesc=$1
InfoFile=/usr/syno/etc/certificate/_archive/INFO
CertRootPath=/usr/syno/etc/certificate/_archive
OriginRenewedCertPath=/volume1/raspberry/acme/rsa

Du solltest die Definition der Variable OriginRenewedCertPath= als erstes definieren, weil die anderen wie CertFile, HashFileCurrent und HashFileTemp benötigen diese. Also bitte ganz nach oben verschieben...
Sonst passen die Pfade später nicht, da die Variable vorher noch leer ist!
Somit würde CertFile z.B. nur den Inhalt /*.pem beinhalten.


Diese Sektion hast du zweimal drin. Einmal ab Zeile 49 und einmal ab Zeile 67. Warum? Benötigst du nicht. Den Copy Befehl und den Restart vom Webserver genau dort beim ersten Konstrukt ausführen wo vorher die echo's drin waren.

Rich (BBCode):
49  if [ "$searchPatternDesc" == "$description" ]; then
50  # echo Random Folder Found: $randomFolderName
51  # echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
52  result=0
53  fi
54  done


67  if [ "$searchPatternDesc" == "$description" ]; then
68  # echo Random Folder Found: $randomFolderName
69  # echo "Cert Path for the searched description is: "$CertRootPath/$randomFolderName
70  TargetPath=$CertRootPath/$randomFolderName
71  cp $OriginRenewedCertPath/* $TargetPath
72  result=0
73  # restart nginx
74  synoservicectl --restart nginx
75  fi

Sonst müsste es eigentlich passen auf den ersten Blick ohne es in meiner Umgebung verifiziert zu haben.


Edit:
Bei der Variablendefinition CertFile= würde ich eine einzige Datei explizit angeben.
Es soll definitv nur die cert.pem beobachtet werden.

Ich würde in deinem Fall die Definition so gestalten: CertFile=$OriginRenewedCertPath/cert.pem

--luddi
 
Zuletzt bearbeitet:

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hallo blinddark,

ich habe das Skript überarbeitet. Das heißt, ich habe beide Skripte zusammengefasst in eines wie du es bereits begonnen hast. Zudem habe ich deine Pfadangaben übernommen.
Für den Test habe ich in meiner Umgebung die Definition der Variablen anpassen müssen. Meine Tests waren bei mir jedenfalls erfolgreich.

Ich habe auch alle Ausgaben (die echo's) entfernt und können bei Bedarf für Debugging Zwecke aktiviert werden.

Schaue es dir in Ruhe an ob alles plausibel ist bevor du es ausführen wirst.
Es wird jetzt immer nur die cert.pem Datei auf eine Änderung der Checksumme geprüft. Hat sich diese geändert, so wird mit dem Übergabeparameter (Description) die INFO Datei durchsucht und der entsprechende Zielpfad erstellt. Anschließend werden alle *.pem Dateien des Quellverzeichnis ins Zielverzeichnis kopiert. Zu guter letzt wird der Webserver (nginx) neu gestartet.


Ich hoffe es klappt auch bei dir. Viel Erfolg beim Test. Lass es mich wissen solltest du Fehlermeldungen bei der Ausführung bekommen.
Das Skript findest du hier im Anhang als Textdatei um nicht die Beiträge zu sprengen :) --> Anhang anzeigen blinddark.txt

--luddi
 
  • Like
Reaktionen: starmagoo

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi luddi

vielen Dank dafür. Ich habe leider bis heute keine Zeit mehr gefunden. Heute oder Morgen geht es aber weiter mit Testen. Du bekommst auf jeden Fall eine Rückmeldung.
 

luddi

Benutzer
Sehr erfahren
Mitglied seit
05. Sep 2012
Beiträge
3.259
Punkte für Reaktionen
601
Punkte
174
Hi blinddark,

das ist überhaupt kein Problem. Die Pfade in dem Skript habe ich entsprechend aus deinen vorliegenden Informationen übernommen. Diese sollten somit auch mit deiner Umgebung übereinstimmen. Wenn es noch an irgendeiner Stelle zwickt werden wir dies auch noch beheben. Ich bin auf deine Rückmeldung gespannt.

--luddi
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
159
Punkte für Reaktionen
23
Punkte
18
Hallo Luddi, hallo blinddark,
ich betreite Synology Drive hinter einer RasPi mit ReverseProxy. Leider benötigt Drive für die Win10 App und die DS Cloud App, noch den Port 6690, den der Router direkt auf die DS weiterleitet. Dadurch dass aber Port 80,443 auf die RasPi zum ReverseProxy gehen, kann die DS selber keine Zertifikate abholen. Nach einer kurzen Suche über google, bin ich auf euren Beitrag gestoßen. Das Skript von luddi habe ich auf der DS zum laufen bekommen. Alles funktinooiert super.

1. RasPi holt das Zertifikat und kopiert es über nfs auf die DS in einen share Ordner
2. DS holt sich über das Skript aus den share Ordner die Zertifikate und mit hilfe dieses skriptes werden die zertifikate bei Bedarf automatisch übernommen

Vielen dank an euch!
 

blinddark

Benutzer
Mitglied seit
03. Jan 2013
Beiträge
1.386
Punkte für Reaktionen
34
Punkte
68
Hi,

wie hast du den ReverseProxy auf deinem Pi eingerichtet und vor allem welchen? Ich möchte diesen auch auslagern, da der Pi doch schneller rebootet und man doch mehr Settings zur Verfügung hat, die nicht nach einem Update wieder überschrieben werden.
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
159
Punkte für Reaktionen
23
Punkte
18
Jo,
ich habe pi4 mit 4 GB, darauf läuft Pihole. Als ReverseProxy habe ich Nginx laufen und certbot für letsencrypt.

Im Router habe ich n Port 80 und 443 auf die Pi umgeleitet. Jenachdem mit welche Domain, subdomain angefragt wird, leitet der reverseproxy alle Dienste weiter, u.a. auch die Synology (DSM, Drive, Calendar, Contacts).
Zusätzlich, damit die Drive Win10 App Synchronisieren kann musste ich Port 6690 im Router direkt auf die Syno weiterleiten. Leider funzt der Sync nicht über den ReverseProxy, die App muss direkt mit der Synology quatschen.
Damit ergab sich aber ein Problem, denn Drive mit SSL war damit direkt nicht möglich, denn die Syno hatte ja keine Möglichkeit an Port 80 zu kommen, den da war ja schon die Pi.
Also lasse ich nun die Pi die Zertifikate holen und kopiere diese via NFS von der Pi auf die Syno. Das Skript von euch kam genau richtig, denn damit ist jetzt alles automatisiert.

Hoffe ich konnte dir helfen.
 

KGBist2000

Benutzer
Mitglied seit
10. Jan 2016
Beiträge
159
Punkte für Reaktionen
23
Punkte
18
so sieht meine config für nginx reverse proxy für das Beispiel Synology-Drive (Web-Interface und iOS App)
Rich (BBCode):
server {
        listen 80;
        listen [::]:80;
        server_name drive.domain.de;

        # redict to https (only SSL)
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name drive.domain.de;
        ssl on;

        # Zertifikate letsencypte
        ssl_certificate /etc/letsencrypt/live/drive.domain.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/drive.domain.de/privkey.pem;

        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        # Set global proxy settings
        proxy_read_timeout      360;

        proxy_http_version 1.1;
        proxy_pass_request_headers on;

        proxy_pass_header       Date;
        proxy_pass_header       Server;

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Accept-Encoding "";

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # forward to target
        location / { proxy_pass https://192.168.76.10:10003;}
}

Wie schon oben beschrieben funktioniert es nich für Win10 App, Cloudstation Win10 App und DS-Cloud. Die brauchen Port 6690. Aber das habe ich auch gelöst siehe meine Antwort #39.
 
Status
Für weitere Antworten geschlossen.
 

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