Automatischer Zertifikats-Export in Fritzbox

Status
Für weitere Antworten geschlossen.

ClearEyetemAA55

Benutzer
Mitglied seit
14. Apr 2018
Beiträge
272
Punkte für Reaktionen
4
Punkte
18
Und weiter geht´s...

Ich möchte gerne, dass das Let´sEncrypt-Zertifikat, von der Diskstation automatisch an die Fritzbox weitergereicht wird. Warum? Niemand liest oder klickt sich gerne durch Zertifikatswarnung.

Ich verwende als DDNS-Dienst myfritz von AVM (kostenlos und schnell eingerichtet). Per Diskstation wurde für diese DDNS-Adresse ein Zertifikat bei Let´sEncrypt abgerufen.
Exportiere ich das Zertifikat manuell, erhalte ich in archive.zip
cert.pem
chain.pem
privkey.pem
Verschieden Howtos erklären, wie sich diese Dateien zusammenfügen lassen, um sie in die Fritzbox übernehmen zu können.
Code:
  cat cert.pem chain.pem privkey.pem > fritz.pem

Das Let´s Encrypt-Zertifikat muss regelmässig per Aufgabenplaner erneuert werden:
Code:
/usr/syno/sbin/syno-letsencrypt renew-all

Um dieses automatisch aktualisiertes Zertifikat auf der Fritzbox zu erhalten, soll nun per Skript eine .pem Datei von der Diskstation in die Fritzbox importiert werden.
https://gist.github.com/wikrie/f1d5747a714e0a34d0582981f7cb4cfb
PHP:
#!/bin/bash

# parameters
USERNAME="maybe empty"
PASSWORD="fritzbox-password"
CERTPATH="/usr/syno/etc/certificate/_archive/..."
CERTPASSWORD="cert password if needed"
HOST=http://fritz.box

# make and secure a temporary file
TMP="$(mktemp -t XXXXXX)"
chmod 600 $TMP

# login to the box and get a valid SID
CHALLENGE=`wget -q -O - $HOST/login_sid.lua | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//'`
HASH="`echo -n $CHALLENGE-$PASSWORD | uconv -f ASCII -t UTF16LE |md5sum|awk '{print $1}'`"
SID=`wget -q -O - "$HOST/login_sid.lua?sid=0000000000000000&username=$USERNAME&response=$CHALLENGE-$HASH"| sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//'`

# generate our upload request
BOUNDARY="---------------------------"`date +%Y%m%d%H%M%S`
printf -- "--$BOUNDARY\r\n" >> $TMP
printf "Content-Disposition: form-data; name=\"sid\"\r\n\r\n$SID\r\n" >> $TMP
printf -- "--$BOUNDARY\r\n" >> $TMP
printf "Content-Disposition: form-data; name=\"BoxCertPassword\"\r\n\r\n$CERTPASSWORD\r\n" >> $TMP
printf -- "--$BOUNDARY\r\n" >> $TMP
printf "Content-Disposition: form-data; name=\"BoxCertImportFile\"; filename=\"BoxCert.pem\"\r\n" >> $TMP
printf "Content-Type: application/octet-stream\r\n\r\n" >> $TMP
cat $CERTPATH/privkey.pem >> $TMP
cat $CERTPATH/fullchain.pem >> $TMP
printf "\r\n" >> $TMP
printf -- "--$BOUNDARY--" >> $TMP

# upload the certificate to the box
wget -q -O - $HOST/cgi-bin/firmwarecfg --header="Content-type: multipart/form-data boundary=$BOUNDARY" --post-file $TMP | grep SSL

# clean up
rm -f $TMP

USERNAME, PASSWORD sind abhängig von den Einstellungen der FB, klar.
Etwas Recherche ergab: CERTPATH ist in /usr/syno/etc/certificate/_archive/... (https://www.synology-forum.de/showthread.html?80821-SSL-Zertifikat-Speicherpfad)
Aus den Comments zum Link ergibt sich außerdem, dass in line 16 iconv zu uconv abgeändert werden soll.

Nur, wenn ich nun das Skript ausführe, ändert sich in der FB nichts.
Code:
@Diskstation:~$ sudo /usr/local/bin/fritzbox-cert-update.sh &
[1] 1402
@Diskstation:~$ 
Redirecting output to 'wget-log'.

Redirecting output to 'wget-log.1'.

Redirecting output to 'wget-log.2'.

Wenn das Skript läuft, soll es übrigens folgendermassen im Aufgabenplaner zusammen mit der Erneuerung des Zertifikats aufgerufen werden können
Code:
/usr/syno/sbin/syno-letsencrypt renew-all  --renew-hook /usr/local/bin/fritz_lets_encrypt.sh


:confused:

Vielleicht ist dieses Weg auch völlig überholt? Und Docker ist dafür mittlerweile zB dein Freund. Ich weiss es nicht. Klärt mich auf
 

bastians

Benutzer
Mitglied seit
29. Jun 2011
Beiträge
65
Punkte für Reaktionen
0
Punkte
6
Wenn auf der FritzBox nur das Zetifikat für die myfritz Adresse benutzt wird, kann die Box das Zertifikat doch selber bei LetsEncrypt verwalten. Ist vielleicht einfacher...

Bastian
 

ClearEyetemAA55

Benutzer
Mitglied seit
14. Apr 2018
Beiträge
272
Punkte für Reaktionen
4
Punkte
18
Das ist bestimmt richtig, aber, da ich neben DDNS auf der Fritzbox auch https/webdav und den VPN-Zugang zur Diskstation zertifizieren möchte, nicht zielführend.

EDIT:

Komme hier nicht weiter. Leider gibt das Skript mit -v auch keine Infos aus, woran es hängt.
Händisch erzeugte Zertifikate (aus privkey+fullchain) lassen sich manuell in die Fritzbox importieren. Das sollte es also nicht sein... Ideen?
 
Zuletzt bearbeitet:

ClearEyetemAA55

Benutzer
Mitglied seit
14. Apr 2018
Beiträge
272
Punkte für Reaktionen
4
Punkte
18
Kapiere es nicht..

PHP:
#!/bin/bash

# parameters
USERNAME="USER"
PASSWORD="PWD"
CERTPATH="/usr/syno/etc/certificate/_archive/..."
CERTPASSWORD=""
HOST=http://fritz.box

Sollte eigentlich klappen, oder?
 

ClearEyetemAA55

Benutzer
Mitglied seit
14. Apr 2018
Beiträge
272
Punkte für Reaktionen
4
Punkte
18
Code:
@Diskstation:~$ sudo /usr/local/bin/fritzbox-cert-update.sh &
[1] 1402
@Diskstation:~$ 
Redirecting output to 'wget-log'.

Redirecting output to 'wget-log.1'.

Redirecting output to 'wget-log.2'.
/QUOTE]

Na immerhin.. nach Anpassung der Nutzer/Gruppe und Zugriffsrechte mit chmod,chown bin ich die Meldungen los
 

ClearEyetemAA55

Benutzer
Mitglied seit
14. Apr 2018
Beiträge
272
Punkte für Reaktionen
4
Punkte
18
So,
mit folgendem Fork läuft des
https://gist.github.com/pawohl/d1784208f8a1a8d20edef474a703e667#file-fritzbox-cert-update-sh

PHP:
#!/bin/bash

set -euo pipefail
IFS=$'\n\t'

# parameters
USERNAME="maybe empty"
PASSWORD="fritzbox-password"
CERTPATH="path to cert eg  /etc/letsencrypt/live/domain.tld/"
CERTPASSWORD="cert password if needed"
HOST="http://fritz.box"
unset RESPONSE

# make and secure a temporary file. Arrange for automatic cleanup
TMP=""
trap 'rm -f "$TMP"' exit
TMP="$(mktemp -t XXXXXX)"
chmod 600 "$TMP"

# login to the box and get a valid SID
CHALLENGE=$(wget -q -O - "$HOST/login_sid.lua" | sed -e 's/^.*<Challenge>//' -e 's/<\/Challenge>.*$//')
if [ -z "$CHALLENGE" ]
  then
    RESPONSE="Is HOST-name pointing to a Fritz!BOX?"
  else
    # continue with the script on success
    HASH="$(echo -n "$CHALLENGE-$PASSWORD" | uconv -f ASCII -t UTF16LE |md5sum|awk '{print $1}')"
    SID=$(wget -q -O - "$HOST/login_sid.lua?sid=0000000000000000&username=$USERNAME&response=$CHALLENGE-$HASH"| sed -e 's/^.*<SID>//' -e 's/<\/SID>.*$//')

    if [[ $SID == "0000000000000000" ]]
      then
        RESPONSE="Failed to authenticate."
      else
        # generate our upload request
        BOUNDARY="---------------------------"$(date +%Y%m%d%H%M%S)
        (
        printf -- "--%s\r\n" "$BOUNDARY"
        printf "Content-Disposition: form-data; name=\"sid\"\r\n\r\n%s\r\n" "$SID"
        printf -- "--%s\r\n" "$BOUNDARY"
        printf "Content-Disposition: form-data; name=\"BoxCertPassword\"\r\n\r\n%s\r\n" "$CERTPASSWORD"
        printf -- "--%s\r\n" "$BOUNDARY"
        printf "Content-Disposition: form-data; name=\"BoxCertImportFile\"; filename=\"BoxCert.pem\"\r\n"
        printf "Content-Type: application/octet-stream\r\n\r\n"
        cat "$CERTPATH"/privkey.pem
        cat "$CERTPATH"/fullchain.pem
        printf "\r\n"
        printf -- "--%s--" "$BOUNDARY"
        ) >> "$TMP"
        
        # upload the certificate to the box
        RESPONSE=$(wget -q -O - "$HOST/cgi-bin/firmwarecfg" --header="Content-type: multipart/form-data boundary=$BOUNDARY" --post-file "$TMP" | grep SSL)
    fi
fi

if [ -z "$RESPONSE" ]
  then
    echo $HOST ": Certificate import failed."
  else
    echo $HOST ": " "$RESPONSE"
fi


Aber folgender Teil nicht...
Rich (BBCode):
/usr/syno/sbin/syno-letsencrypt renew-all  --renew-hook /usr/local/bin/fritz_lets_encrypt.sh

"--renew-hook" kann wohl nur certbot!?
 
Zuletzt bearbeitet:
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