[Frage] SSL Zertifikat (Webserver) per shell einfügen und verteilen

rubinho

Benutzer
Mitglied seit
06. Jun 2009
Beiträge
62
Punkte für Reaktionen
4
Punkte
8
Servus,

ich betreibe zuhause einige Webservices auf meinem NAS und wollte sie per LetsEncrypt Zertifikate absichern.
Problem ist nur, dass ich bereits einen ReverseProxy auf meiner Firewall am laufen habe, der erstens, bereits LetsEncrypt-Zertifikate besitzt und zweitens, die LetsEncrypt-ACME Anfragen der Synology abfängt, so dass das Script fehlschlägt.

Da ich nicht auf meinen vorgelagerten ReverseProxy verzichten will, wollte ich die LetsEncrypt-Zertifikate der Firewall nach jedem Erneuern per Script auf die Synology schieben.
Die Synology wiederum überwacht diesen LetsEncrypt Ordner (per inotify) und führt bei Veränderung das Script aus, die Zertifikate in den Ordner /usr/syno/etc/certificate/_archive/xyz zu kopieren und den Webservice zu reloaden.

Das funktioniert ansich auch, nur hat Synology die Zertifikate aus dem _archive Ordner auf weitere Orte verteilt, die bei einem Reload nicht neu verteilt werden,so dass ich diese auch noch per Script erneuern muss.
Welche Orte das sind, findet man unter /usr/syno/etc/certificate/_archive/INFO.

Ich habe jetzt händisch alle Pfade in mein Script eingegragen, was auch funktioniert. Nur muss ich bei einer weiteren Zertifikats Zuweisung (per Webgui) wieder auf die Konsole und das Script anpassen.

Meine Frage dazu, gibt es einen Befehl auf der Konsole, der die Synology dazu veranlasst, die Zertifikate intern neu zu verteilen, oder kann mir jemand erklären, wie ich die INFO Datei ausgewertet bekomme, so dass mein Script die Änderungen selbständig erkennt.

Hier mal der entsprechende Bereich des INFO Files...
Für die Identifikation sollte nur innerhalb des xyz Bereiches die Datenpunkte "service" abgefragt werden.
Alle die kein vhost vor der UID haben, sind in dem Pfad /usr/syno/etc/certificate/ReverseProxy/<uid> und alle mit vhost vor der UID bekommen den Pfad /usr/local/etc/certificate/WebStation/vhost_<uid>

Rich (BBCode):
{
   "xyz" : {
      "desc" : "lets-Encrypt",
      "services" : [
         {
            "display_name" : "webservice1.example.com",
            "isPkg" : false,
            "owner" : "root",
            "service" : "12345678-74b6-482b-bff6-8da061774bca",
            "subscriber" : "ReverseProxy"
         },
         {
            "display_name" : "webservice2.example.com",
            "isPkg" : false,
            "owner" : "root",
            "service" : "12345678-a033-411f-a2a5-173edab2fe9b",
            "subscriber" : "ReverseProxy"
         },
         {
            "display_name" : "webservice3.example.com",
            "isPkg" : true,
            "owner" : "root",
            "service" : "vhost_12345678-fe73-49ba-a685-576a09063048",
            "subscriber" : "WebStation"
         }
      ]
   }

Vorab danke

Gruß
Rubinho
 

rubinho

Benutzer
Mitglied seit
06. Jun 2009
Beiträge
62
Punkte für Reaktionen
4
Punkte
8
Servus,

falls es einen Interessiert...

Da ich vor kurzem auf LetsEncrypt Wildcard Zertificate umgestellt habe und immer noch das gleiche Problem hatte, hab ich mich wieder intensiv damit beschäftigt.

Nachdem ich gefühlt das halbe Internet durchsucht habe, bin ich auf einen Beitrag im englischen Synology Forum gestoßen, wo ein User genau das gleiche Problem hatte, mit dem Unterschied, dass er Ahnung vom scripten hatte :)
Erfreulicherweise hat er auch seine Erkenntnisse mit der Offentlichkeit geteilt und das will ich für die deutschsprachigen unter uns auch tun....

Nachdem man beide unten angegebenen Dateien erstellt und ausführbar gemacht hat, legt man noch im gleichen Ordner zwei weitere Unterordner an.
Einmail certs und darunter den Ordner der den Namen des Zertifikates hat (Unter Synology Webgui -> Zertifikate einstellbar) oder unter /usr/syno/etc/certificate/_archive/INFO zu sehen,
Wichtig das ursprüngliche Zertifikat muss schon eingebunden sein.

Danach kann man das Zertifikat incl key usw. in den Ordner kopieren (cert.pem privatekey.pem fullchain.pem)
In meinem Fall hieß das Zertifikat lets-Encrypt und somit auch der Ordner ./certs/lets-Encrypt/

Wenn nun das neue Zertifikat in dem Ordner ist, kann man das Script wie folgt ausführen...

Rich (BBCode):
./update-cert lets-Encrypt

Danach werden alle Websites, Apps usw. die das Zertifikat benutzen im dem neuen versorgt.

danach noch ein
Rich (BBCode):
 /usr/syno/sbin/synoservicectl --reload nginx

und der Webservice wird neu geladen.

Das ganze kann man jetzt schön mit dem acmev2 script kombinieren, oder wie in meinem Fall, überwacht die Synology mittels inotifywait einen Ordner auf Veränderung und wenn meine Firewall (PFsense) das neue Zertifikat auf meine Synology schiebt, wird das Script ausgeführt.
Komplett automatsch !



update-cert:

Rich (BBCode):
#!/bin/bash

UPDCERT_USAGE="Usage: ./update-cert CERT_NAME [--by-id]"

CERTS_ROOTDIR=certs
CERT_NAME=$1
CERT_FILES=(cert.pem fullchain.pem privkey.pem)

if [ -z $CERT_NAME ]; then
  echo $UPDCERT_USAGE
  exit -1
fi
if [[ ( -n $2 ) && ( $2 != --by-id ) ]]; then
  echo $UPDCERT_USAGE
  exit -1
fi

CERT_DIR=${CERTS_ROOTDIR}/$CERT_NAME

for CERT_TARGET_DIR in $(python get-cert-dirs.py $CERT_NAME $2); do
  for CERT_FILE in ${CERT_FILES[@]}; do
    eval "cp ${CERT_DIR}/$CERT_FILE ${CERT_TARGET_DIR}/$CERT_FILE"
	eval "chown root:root ${CERT_TARGET_DIR}/$CERT_FILE"
	eval "chmod 600 ${CERT_TARGET_DIR}/$CERT_FILE"
  done
  echo
done

get-cert-dirs.py:
Rich (BBCode):
#!/usr/bin/env python

usage = "./get-cert-dirs.py CERT_NAME [--by-id]"

system_dir = "/usr/syno/etc/certificate"
pkg_dir = "/usr/local/etc/certificate"
archive_dir = system_dir+"/_archive"
info_path = archive_dir+"/INFO"

import sys
import json

def parse_info(cert_name, by_description=False):
    certs = json.loads(open(info_path).read())
    if by_description is True:
        cert_id = None
        for key in certs.keys():
            if certs[key]['desc'] == cert_name:
                cert_id = key
                break
        if cert_id is None:
            return None
    else:
        cert_id = cert_name
    try:
        cert_info = certs[cert_id]
    except KeyError:
        return None

    paths = ["\"{}/{}\"".format(archive_dir, cert_id)]
    for service in cert_info['services']:
        root_dir = pkg_dir if service['isPkg'] is True else system_dir
        path = "\"{}/{}/{}\"".format(root_dir, service['subscriber'], service['service'])
        paths.append(path)

    return paths

if __name__ == "__main__":
    wrong_usage = False
    args_num = len(sys.argv) - 1
    if args_num < 1:
        wrong_usage = True
    elif args_num == 2 and sys.argv[2] != "--by-id":
        wrong_usage = True
    elif args_num > 2:
        wrong_usage = True
    if wrong_usage is True:
        print("Usage: "+usage)
        sys.exit(-1)
    cert_name = sys.argv[1]
    by_description = True if args_num == 1 else False
    dirs = parse_info(cert_name, by_description)
    if dirs is not None:
        print(" ".join(dirs))
 

alexbeer

Benutzer
Mitglied seit
06. Jan 2013
Beiträge
13
Punkte für Reaktionen
0
Punkte
1
Hallo,
dein Post ist zwar schon etwas älter - kommt mir jedoch sehr gelegen.
Ich verwende ein ähnliches Setup.
auf meiner pfSense Firewall generiere ich ein wildcard LE Zertifikat per ACME v2.
Bislang kopiere ich das Zertifikat von der pfSense nicht auf die Synology.
Ich habe zwar die Option
[x]Write ACME certificates to /conf/acme/ in various formats for use by other scripts or daemons which do not integrate with the certificate manager
aktiviert, sonst aber weiter nichts eingerichtet.
Wie hast du das kopieren der Zertifikate von der pfSense auf die Synology gelöst?


Bislang habe ich auf der Synology ein eigenes LE Zertifikat verwendet. Genutzt habe ich hier den Weg, der hier dokumentiert ist: https://github.com/Neilpang/acme.sh/wiki/Synology-NAS-Guide
Leider haben die letzten Updates nicht mehr geklappt und ich habe gerade keine Idee, was sich geändert haben könnte...
Ich vermute, dass eines der letzten DSM-Updates mir ein Strich durch die Rechnung gemacht hat.

Über einen Austausch hier würde ich mich freuen.
VG Alex

Edit:
Wer lesen kann, ist klar im Vorteil:
Fix a broken environment after Synology DSM upgrade
$ cd /usr/local/share/acme.sh
$ ./acme.sh --upgrade --nocron --home /usr/local/share/acme.sh

ich habe den Befehl per SUDO abgesetzt, hier muss dann noch der Parameter "--force" mitgegeben werden, s. https://github.com/Neilpang/acme.sh/wiki/sudo
 
Zuletzt bearbeitet:

Tattoofreak

Benutzer
Mitglied seit
04. Okt 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Bei mir klappt das leider (noch) nicht.
Hierzu noch zwei Fragen.

Frage 1:

Habe ich das richtigen verstanden, dass die beiden Scripts und das exportierte Zertifikat der pfSense in demselben Verzeichnis wie die Default Zertifikate der Synology sein sollen?
Also so:

/usr/syno/etc/certificate/_archive/update-cert
/usr/syno/etc/certificate/_archive/get-cert-dirs.py
/usr/syno/etc/certificate/_archive/certs/<meinZertifikat>

Frage 2:
Die Zertifikatsdateien, welche die pfSense erstellt, werden ja nicht im .pem-Dateiformat erstellt, sondern .key und .crt. Ich weiss, dass DSM automatisch die .pem-Dateien erzeugt, wenn ich die Dateien manuell via GUI importiere. Das mache ich hier aber nicht (ausser beim ersten Import natürlich). Kann ich also die beiden Dateien, so wie sie in pfSense erstellt wurden, einfach via SCP ins Verzeichnis /usr/syno/etc/certificate/_archive/certs/<meinZertifikat> kopieren und das Script, bzw. DSM kümmert sich dann automatisch um die Konvertierung ins .pem-Dateiformat?

Danke und Gruss
 

Tattoofreak

Benutzer
Mitglied seit
04. Okt 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
OK, das werde ich versuchen. Verstehe ich das richtig: Muss ich die Codezeilen aus Punkt 20 in eine Datei namens synology_dsm schreiben und die Werte ggf. entsprechend anpassen?
Ich nehme an die letzte Zeile gehört dann nicht in die synology_dsm-Datei, sondern ist lediglich eine Anleitung, wie man die acme.sh dann effektiv benutzt und auf die synology_dsm verweist?
 
Zuletzt bearbeitet von einem Moderator:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Das hängt davon ab, wie acme.sh in pfsense umgesetzt ist. Kommt es aus einem git clone, dann sind die dns-apis und hook-scripts schon Teil der Installation. Dann geht es im script nur darum die "Parameter" (also die Zeilen mit "export") zu setzen womit dann das hook-script synology_dsm welches schon vorhanden ist zu füttern.

Die ganze Anleitung und Beispiele sind scripts wie man acme.sh aufruft/bedient/effektiv benutzt.
 

Tattoofreak

Benutzer
Mitglied seit
04. Okt 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
OK, danke. Scheint, als wäre das nicht so trivial. wenn es nicht aus einem git clone kommt.. Vermutlich wurde es auf das pfSense Plugin angepasst, ich kriege es nicht hin. Habe mal auf Reddit um Hilfe gebeten, würde aber auch gern den anderen Ansatz weiterverfolgen. Mal abwarten, ob noch jemand antwortet.
 
Zuletzt bearbeitet von einem Moderator:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
zu 1) wo die scripte liegen dürfte egal sein, da die Pfade abgefragt werden intern

zu 2) die scripte kümmern sich NICHT um eine Konvertierung (wenn ascii ist es eine reine Umbenennung) von crt nach pem. Auch der DSM macht das nur beim Import.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Musst halt mal den Inhalt kontrollieren. Falls ASCII identisch kannst einfach umbenennen, andernfalls ist openssl dein Freund für allerlei Konvertierungen.
 

Tattoofreak

Benutzer
Mitglied seit
04. Okt 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Scheint alles ASCII zu sein. Ich mache mal weiter, danke auf jeden Fall für deine wertvolle Hilfe!
 
Zuletzt bearbeitet von einem Moderator:

Tattoofreak

Benutzer
Mitglied seit
04. Okt 2014
Beiträge
61
Punkte für Reaktionen
3
Punkte
8
Habe nun alles erfolgreich eingerichtet.
Meine konstruktive Kritik: Hätte vom OP ruhig etwas ausführlicher sein dürfen, es fehlen einige zentrale Informationen. Ich werde das demächst auf meiner Tutorial-Website veröffentlichen und hier verlinken, sodass das jeder selbst nachmachen kann.
Danke nochmals @Fusion für die Unterstützung und natürlich auch dem OP!
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Freut mich, gespannt auf deine Ausführungen.

Ich sehe das eher als: Jeder hat seine Perspektive. Was dem einen fehlt ist für den anderen selbstverständlich oder anderweitig gegeben.
Erst im Zusammenspiel vieler Perspektiven entsteht ein Resultat, welches für die Mehrheit schneller/einfacher verständlich sein kann.
Ist jedenfalls meine Erfahrung mit "Anleitungen", egal wie sehr man versucht alle Seiten abzudecken, es gibt immer jemand der es anders sieht oder wie gegeben nicht einzuordnen / umzusetzen vermag (aus welchem Grund auch immer).
Zumal ich die Posts vom TE eher als Hilfestellung/Anker sehe und nicht mit dem Anspruch ein Tutorial/Anleitung zu sein.

Na ja, bin gespannt auf dein Tutorial. :)
 

deejay_ronny

Benutzer
Mitglied seit
06. Sep 2017
Beiträge
2
Punkte für Reaktionen
0
Punkte
1

shuvit

Benutzer
Mitglied seit
23. Jul 2010
Beiträge
7
Punkte für Reaktionen
4
Punkte
59
@Tatoofreak : Super Anleitung! Danke für Deine Mühe!
 

rubinho

Benutzer
Mitglied seit
06. Jun 2009
Beiträge
62
Punkte für Reaktionen
4
Punkte
8
Servus Leute,

Falls noch nicht gemerkt, seit DSM7 gibt es neue Befehle für das neustarten der Webdienste.

Code:
Alter Befehl (DSM6)
/usr/syno/sbin/synoservicectl --reload nginx

Neuer Befehl (DSM7)
/usr/bin/systemct restart nginx

Das Script ansich scheint noch zu funktionieren.

Gruß
Rubinho
 


 

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