Zugriff auf Surveillance Station Synology SSL Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

Hallo,

ich möchte mit Python einen event auf einer Surveillance Station starten:

https://192.168.0.200:9901/webapi/entry ... 22xxxxx%22

ich bekomme eine Fehlermeldung:

requests.exceptions.SSLError: HTTPSConnectionPool(host='diskstation', port=5001): Max retries exceeded with url: /webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalEvent&method=%22Trigger%22&version=1&eventId=1&account=cam&password=XYxxxxx99 (Caused by SSLError(CertificateError("hostname 'diskstation' doesn't match either of '*.mkxxxxlt.synology.me'")))

Im Browser kann ich den Fehler abfangen, doch wie geht das in Python?

Firefox hat ein mögliches Sicherheitsrisiko erkannt und 192.168.0.200 nicht geladen. Falls Sie die Website besuchen, könnten Angreifer versuchen, Passwörter, E-Mails oder Kreditkartendaten zu stehlen.

Der Synology Service sagt mir:

Die Warnung, die Sie im Browser sehen, wird ausschließlich vom Browser selbst erzeugt. Wenn Sie eine Seite über HTTPS aufrufen, muss die sichere Verbindung (das "S" in HTTPS) durch ein Zertifikat verifiziert werden. Erfolgt der Aufruf nicht über die passende Domain, wird eine Sicherheitsmeldung ausgegeben.

leider zu Python sagt er nichts.

Michael
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum passt das Zertifikat nicht zum Host?
Muß der Host eigentlich diskstation.mkxxxxlt.synology.me sein?
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

Ich möchten den event nicht extern aufrufen und dafür einen Port freischalten müssen. Außerdem soll der event auch starten, wenn mal kein Internet zur Verfügung steh.
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Hast du mal in die Dokumentation von requests geschaut?
Ich bin mir fast sicher, dass es da einen ganzen Abschnitt gibt, der "ssl cert verification" heißt.
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

@michael99: und was hat PORT freischalten und Internet damit zu tun, dass das Zertifikat offensichtlich für einen anderen Namen ausgestellt ist?
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

sparrow hat geschrieben: Samstag 22. Juni 2024, 08:54 Hast du mal in die Dokumentation von requests geschaut?
Ich bin mir fast sicher, dass es da einen ganzen Abschnitt gibt, der "ssl cert verification" heißt.
Habe ich auch schon, doch auch das funktioniert nicht. Das hier ist die Funktion

def senden(befehl):
urllib3.disable_warnings()
url = 'https://mxxxxxxx.synology.me:5001/webap ... /v1?token=' + befehl
try:
x=5
session = requests.Session()
session.get(url,verify=False,timeout=x)
print ("Ergebnis " + str(r) + ' URL: ' + url)
except:
print('error ' + str(url))
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum gehst Du das Problem nicht an der Wurzel an und nimmst entweder den richtigen Hostnamen oder das richtige Zertifikat?
In Deinem letzten Beispiel nutzt Du jetzt `mkxxxxlt.synology.me`, wo ist da `diskstation` geblieben?
Wie sieht die Fehlermeldung dann aus?

Man benutzt keine nackten Except, weil das die eigentliche Fehlermeldung kaputt macht.
Man stückelt keine Strings per + zusammen, erst recht nicht, wenn es sich eigentlich um URL-Parameter handelt.

Code: Alles auswählen

URL = 'https://diskstation.mxxxxxxx.synology.me:5001/webapp.../v1'
def senden(befehl):
    response = requests.get(URL, params={'token': befehl})
    response.raise_for_status()
    return response
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@michael99: Die Fehlermeldung aus dem ersten Beitrag passt jetzt aber nicht zu diesem Quelltext. Die URL ist eine andere und der Code sieht auch nicht ”echt” aus, denn es wird ein `r` verwendet was undefiniert ist. Wahrscheinlich sollte das das Ergebnis von dem `get()`-Aufruf sein.

Die Ausnahmebehandlung mit einem nackten ``except:`` ohne konkrete Ausnahmen anzugeben, und dann einfach nur die Ausnahme mit `print()` ausgeben ist nicht sinnvoll.

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Parameter in URLs würde ich durch die `requests`-Bibliothek setzen und nicht selbst als Zeichenkette zusammenbasteln.

Ein `Session`-Objekt für eine einzige Anfrage macht keinen Sinn.

Code: Alles auswählen

def senden(befehl):
    response = requests.get(
        "https://mxxxxxxx.synology.me:5001/webapi/SurveillanceStation/Webhook/Incoming/v1",
        params={"token": befehl},
        timeout=5,
        verify=False,
    )
    response.raise_for_status()
    print("Ergebnis", response, "URL:", response.url)
    # Oder:
    print(f"Ergebnis {response} URL: {response.url}")
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

__blackjack__ hat geschrieben: Dienstag 25. Juni 2024, 08:42 @michael99: Die Fehlermeldung aus dem ersten Beitrag passt jetzt aber nicht zu diesem Quelltext. Die URL ist eine andere und der Code sieht auch nicht ”echt” aus, denn es wird ein `r` verwendet was undefiniert ist. Wahrscheinlich sollte das das Ergebnis von dem `get()`-Aufruf sein.

Die Ausnahmebehandlung mit einem nackten ``except:`` ohne konkrete Ausnahmen anzugeben, und dann einfach nur die Ausnahme mit `print()` ausgeben ist nicht sinnvoll.

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.
Ok, ich habe das mal so umgesetzt und ja, es sieht besser aus. Das mit dem 'r' lag am kopieren des Inhalts.

Das SSL Problem ist allerdings noch nicht gelöst.

Michael
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn jetzt probiert und wie lautet die komplette Fehlermeldung?
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

Sirius3 hat geschrieben: Mittwoch 3. Juli 2024, 13:46 Was hast Du denn jetzt probiert und wie lautet die komplette Fehlermeldung?
Es gibt keine Fehler, weil ich zur Zeit den externen Befehl nutze. Mir geht es um einen internen Zugang. Die Surveillance Station lässt nur https zu. Https mit der lokalen IP führt allerdings zu dem ganz zu Anfang genanntem Fehler.

Michael
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Dann zeigen was du machst und dazu passende Fehlermeldung.
michael99
User
Beiträge: 6
Registriert: Montag 17. Juni 2024, 18:34

sparrow hat geschrieben: Sonntag 14. Juli 2024, 12:03 Dann zeigen was du machst und dazu passende Fehlermeldung.
????????? Schau mal ganz oben den Startbeitrag.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@michael99: Das hatten wir doch schon das Code und Fehlermeldung von dort nicht zusammenpassen. Wie sieht der aktuelle Code und der dazu gehörende Traceback aus, war die Frage.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

@michael99: In ersten Beitrag passen Code und Fehlermeldung nicht zusammen. Dann hast du hinterher Dinge probiert und das mit "funktioniert nicht" abgetan. "Funktioniert nicht" ist nur überhaupt nicht hilfreich.

Deshalb dein derzeitiger Code mit dem derzeitigen Fehler. Und wenn du den Abschnitt in der Dokumentation gelesen hast, gerne auch den Code der daraus entstanden ist- ebenfalls mit der passenden Fehlermeldung.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1217
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ernst gemeinte Frage: Habt ihr schon mal mit SSL gearbeitet?

Wenn man die lokale IP der NAS im eigenen Netzwerk nutzt, um auf die NAS zuzugreifen, ist der SSL-Fehler normal. Der Host stimmt nicht mit der eingetragenen Domain im SSL-Zertifikat überein, wenn man die IP-Adresse verwendet.

Um den SSL-Fehler zu verhindern, müsstest du die Domain zur Verbindung nutzen. Falls das nicht geht, da dein Router das nicht unterstützt, kannst du auf den Clients zur Not hosts-Einträge hinzufügen.
Unter Windows geht das auch.

Es muss dann die lokale IP der NAS auf die Domain zeigen. Wenn man dann die Domain zur Verbindung nutzt, spuckt der Resolver die lokale IP aus. Die Überprüfung des Hostnamens funktioniert dann auch.
Alternativ: requests.get(url, verify=False)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Ernst gemeinte Frage: Hast du den Threadverlauf gelesen?
Das Abschalten der Verifikation "geht nicht". Da waren wir ja schon. Deshalb die Frage nach dem aktuellen Stand und der Fehlermeldung.
Antworten