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
Zugriff auf Surveillance Station Synology SSL Problem
Habe ich auch schon, doch auch das funktioniert nicht. Das hier ist die Funktionsparrow 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.
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))
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.
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
- __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.
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
Ok, ich habe das mal so umgesetzt und ja, es sieht besser aus. Das mit dem 'r' lag am kopieren des Inhalts.__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.
Das SSL Problem ist allerdings noch nicht gelöst.
Michael
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.Sirius3 hat geschrieben: Mittwoch 3. Juli 2024, 13:46 Was hast Du denn jetzt probiert und wie lautet die komplette Fehlermeldung?
Michael
- __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
@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.
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.
- 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)
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