Entwickler-Ecke

Internet / Netzwerk - Indy TIdHTTP - Fehler bei IdHTTP1.Get


galagher - So 15.12.24 10:36
Titel: Indy TIdHTTP - Fehler bei IdHTTP1.Get
Ich verwende in meinem Programm die Indy-Komponenten TIdHTTP und TIdSSLIOHandlerSocketOpenSSL. Wenn ich Text mit s := IdHTTP1.Get(Edit1.Text); auslesen will, entsteht der folgende Fehler:
Zitat:
Fehler beim Verbinden mit SSL.
error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version

Was bedeutet das?

Unter Windows7 funktionierte es noch.

Die Eigenschaft IdHTTP1.Request.UserAgent ist vorgabemäßig "Mozilla/3.0 (compatible; Indy Library)". Mozilla 3.0! Ehrlich gesagt, habe ich keine Ahnung, ob ich das so lassen kann oder irgendwie anpassen muss oder was ich sonst bei IdHTTP1 anpassen muss, damit es wieder funktioniert.

Vielleicht kennt sich da jemand besser aus als ich!

Moderiert von user profile iconTh69: Titel geändert ("Jedi"->"Indy").


Ralf Jansen - So 15.12.24 16:02

Du scheinst mit irgendeinem Server per Tls1 sprechen zu wollen. Die meisten Server lehnen das mittlerweile als unsicher (zurecht) ab. Irgendwo kann man bestimmt via Indy die zu benutzen Tls Version vorgeben. Zumindest Tls 1.2 solltest du vorgeben, besser 1.3, aber das funktioniert erst ab Windows 11 richtig.


galagher - So 15.12.24 19:27

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Irgendwo kann man bestimmt via Indy die zu benutzen Tls Version vorgeben.

Bei TIdSSLIOHandlerSocketOpenSSL gibt es die Einstellung "SSLVersions" im OI (oder auch per Code):

Delphi-Quelltext
1:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1];                    

Alternativ:

Delphi-Quelltext
1:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;                    

Ist es das, was du meinst?

sslvTLSv1 ist die Voreinstellung, es funktioniert aber leider keine der verfügbaren Optionen: sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2, wobei sslvSSLv23 alle genannten auf True setzt, selbst aber nicht gesetzt werden kann (bleibt immer False).


Und was hat es mit "Mozilla 3.0" auf sich? Diese Version ist doch total veraltet!


jaenicke - So 15.12.24 20:48

Kann es sein, dass schlicht deine OpenSSL-DLLs zu alt sind? Unter Windows 7 gingen noch TLS 1.0 und TLS 1.1, wohingegen diese in Windows 11 nicht mehr standardmäßig zur Verfügung stehen. Vielleicht hast du aber DLLs, die nichts Neueres können.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Und was hat es mit "Mozilla 3.0" auf sich? Diese Version ist doch total veraltet!
Das ist nur einn String zur Identifikation des Useragents. Der sagt dem Server also, was für ein Client dranhängt, damit der Server darauf reagieren kann. Zum Beispiel wurde für den Internet Explorer damals wegen Bugs manchmal anderer Code ausgeliefert.


Ralf Jansen - So 15.12.24 20:48

Zitat:
Und was hat es mit "Mozilla 3.0" auf sich? Diese Version ist doch total veraltet!

Hat nix mit deinem TLS Problem zu tun. In den User Agent kannst du rein schreiben was du willst. Das der Server daran irgendwas filtert ist ein Ding der 00er Jahre. Jeder Serverbetreiber sollte gemerkt haben das man den User Agent beliebig setzen kann und beliebig gesetzt wird und nichts aussagt. Wenn du Nett sein will schreib da den Applikationsnamen deiner Anwendung mit rein. Gibt dem Serverbetreiber eine Möglichkeit für seine Statistiken.


galagher - Mo 16.12.24 06:21

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein, dass schlicht deine OpenSSL-DLLs zu alt sind?
Kann schon sein, ich weiß nicht... :nixweiss: War nie ein Thema für mich, Internetzugang habe ich, und gut ist's.
Was also soll ich da genau machen? Sind die OpenSSL eine "Delphi-Sache"? Die OpenSSL-DLLs aktualisieren? Wie? :nixweiss:


galagher - Di 17.12.24 06:13

Habe auch im Internet nichts Hilfreiches zu dem Thema gefunden, also hoffe ich, dass hier jemand eine Lösung hat. Was kann ich tun?


jaenicke - Di 17.12.24 13:12

Die aktuellen DLLs für OpenSSL findest du hier:
https://github.com/IndySockets/OpenSSL-Binaries
Für 32-Bit brauchst du also die openssl-1.0.2u-i386-win32.zip. Die Dateien kannst du direkt neben deine Exe legen wie gewohnt.


galagher - Di 17.12.24 17:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Dateien kannst du direkt neben deine Exe legen wie gewohnt.

Ich habe beide dll's in den Ordner meiner exe-Datei entpackt und erhalte wieder dies:


Delphi-Quelltext
1:
2:
Fehler beim Verbinden mit SSL.
error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version


Oder meintest du "direkt neben deine Exe legen" anders? Ich meine, ich habe früher, unter Windows7, doch auch keine dll-Dateien zu meiner exe gegeben, und es hat funktioniert.


jaenicke - Di 17.12.24 17:38

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Oder meintest du "direkt neben deine Exe legen" anders? Ich meine, ich habe früher, unter Windows7, doch auch keine dll-Dateien zu meiner exe gegeben, und es hat funktioniert.
Dann lagen diese zufälligerweise irgendwo auf deinem System herum und deine Exe hat die gekapert. ;-)

Kannst du vielleicht eine Beispieladresse nennen, bei der das auftritt? Hast du es mit verschiedenen Servern versucht?


galagher - Di 17.12.24 17:50

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kannst du vielleicht eine Beispieladresse nennen, bei der das auftritt? Hast du es mit verschiedenen Servern versucht?
Das tritt jedesmal auf, bei https://entwickler-ecke.de/viewtopic.php?p=721850#721850, bei https://de.wikipedia.org/wiki/, einfach bei jeder Adresse.

Da ich ehrlich gesagt das Ganze nicht wirklich verstehe, (sondern einfach froh war, dass es funktionierte :mrgreen: ), frage ich mich, was du mit "verschiedenen Servern" meinst. Die bereits genannten Einstellungen in TIdSSLIOHandlerSocketOpenSSL? Die Voreinstellung klappt nicht.

Moderiert von user profile iconTh69: Doppelposting entfernt.


jaenicke - Di 17.12.24 21:24

Kannst du bitte einmal eine solche Exe anhängen? Mich würde interessieren, ob es bei mir geht und nach welchen DLLs die sucht. Ich habe 10.1 leider nicht mehr parat.


Th69 - Mi 18.12.24 11:12

Hallo galagher,

du meinst Indy [https://www.indyproject.org] (anstatt JEDI [https://github.com/project-jedi/jvcl])!? Ich habe deswegen mal den Titel geändert.

Welche Indy-Version [https://www.indyproject.org/download] benutzt du denn (9 oder 10)?

In der Delphi-PRAXiS gibt es auch ähnliche Themen dazu:
IdHTTP mit SSL [https://www.delphipraxis.net/212093-idhttp-mit-ssl.html]
tlsv1 alert protocol version [https://en.delphipraxis.net/topic/3990-tlsv1-alert-protocol-version]


galagher - Mi 18.12.24 16:14

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kannst du bitte einmal eine solche Exe anhängen? Mich würde interessieren, ob es bei mir geht und nach welchen DLLs die sucht. Ich habe 10.1 leider nicht mehr parat.

Kann ich leider nicht: Obwohl die EXE nur ca. 2,7 MB hat, bekomme ich vom Forum die Meldung:
Zitat:
Der Dateianhang ist zu groß. Maximale Größe: 5MB


Versuche jetzt, sie in einer zip-Datei zu senden, mal sehen...


galagher - Mi 18.12.24 16:21

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
du meinst Indy [https://www.indyproject.org] (anstatt JEDI [https://github.com/project-jedi/jvcl])!? Ich habe deswegen mal den Titel geändert.
Indy, sorry!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Welche Indy-Version [https://www.indyproject.org/download] benutzt du denn (9 oder 10)?
Ich benutze Indy10.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
In der Delphi-PRAXiS gibt es auch ähnliche Themen dazu:
Sehe ich mir gleich an!
//Edit: Leider nicht hilfreich!


galagher - Mi 18.12.24 16:26

zip-Datei im Anhang!


jaenicke - Mi 18.12.24 20:48

Die Exe lädt die korrekten DLLs, wenn ich sie bereitstelle, aber es geht dennoch nicht. Es kann daher nur daran liegen, was in den Komponenten eingestellt ist, oder an der Indyversion.

Ich bekomme das mit Delphi 10.4 nur, wenn ich den Standard (TLS 1.0) eingestellt lasse. So funktioniert es:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  Http: TIdHTTP;
  IndyOpenSsl: TIdSSLIOHandlerSocketOpenSSL;
begin
  Http := TIdHTTP.Create(nil);
  try
    IndyOpenSsl := TIdSSLIOHandlerSocketOpenSSL.Create(Http);
    IndyOpenSsl.SSLOptions.SSLVersions := [sslvTLSv1_1, sslvTLSv1_2];
    Http.IOHandler := IndyOpenSsl;
    ShowMessage(Http.Get(Edit1.Text));
  finally
    Http.Free;
  end;
end;
Du hattest ja geschrieben, dass du das schon versucht hattest, aber ich glaube, dass da etwas nicht richtig war. Versuch es mal bitte so.


galagher - Mi 18.12.24 21:00

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Versuch es mal bitte so.

Da erhalte ich den Fehler:
Zitat:
Fehler beim Verbinden mit SSL.

error:140740BF:SSL routines:SSL23_CLIENT_HELLO:no protocols available.


jaenicke - Mi 18.12.24 23:00

Ich hänge mal das komplette Projekt an.


galagher - Do 19.12.24 16:54

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich hänge mal das komplette Projekt an.

Funktioniert, und funktioniert auch in meinem Programm mit TIdHTTP und TIdSSLIOHandlerSocketOpenSSL mit den richtigen Einstellungen:

Delphi-Quelltext
1:
2:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_1, sslvTLSv1_2];
IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

Bei Get('https://de.wikipedia.org') erhalte ich die Meldung:
Zitat:
HTTP/1.1 301 Moved Permanently

Was hat denn das zu bedeuten? Genau damit hat es unter Windows7 noch funktioniert!

Get('https://de.wikipedia.org/wiki/Wikipedia:Hauptseite') hingegen klappt.

Weiters benötige ich tatsächlich beide dll's - unter Windows7 war das nicht so.

Jedenfalls bin ich einen Riesenschritt weiter!


jaenicke - Do 19.12.24 18:41

HTTP 301 ist eine Umleitung auf eine andere Adresse. Du kannst einfach HandleRedirects auf True setzen, damit Indy dieser Weiterleitung automatisch folgt.

Ich war nach dem Threadverlauf davon ausgegangen, dass du die Einstellungen schon getestet hattest, aber ohne Quelltext lässt sich das eben nicht prüfen. :wink:


galagher - Do 19.12.24 19:55

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich war nach dem Threadverlauf davon ausgegangen, dass du die Einstellungen schon getestet hattest,
Möglicherweise habe ich das, aber ohne die dll's im Ordner zu haben. Oder ich hatte die dll's, aber die falschen Einstellungen. Ich habe alle möglichen Kombinationen getestet, alle erfolglos.

Jetzt klappt aber alles! Danke! :D


galagher - Fr 20.12.24 07:19

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt klappt aber alles! Danke! :D
Bleibt noch die Frage: Wie sicher ist das eigentlich? :?


jaenicke - Fr 20.12.24 07:58

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt klappt aber alles! Danke! :D
Bleibt noch die Frage: Wie sicher ist das eigentlich? :?
Du meinst, dass es weiterhin funktioniert?

So lange TLS 1.2 noch unterwegs ist, wird es auch funktionieren, denn die DLLs hast du ja nun bei der Exe statt irgendwo zufällig im System.

Wenn du zukunftssicher unterwegs sein möchtest, musst du ICS [https://wiki.overbyte.eu/wiki/index.php/ICS_Download] mit Unterstützung für neuere OpenSSL Versionen und TLS 1.3 nutzen.


galagher - Fr 20.12.24 08:18

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du meinst, dass es weiterhin funktioniert?
Nein, ich meine, wie gefahrlos bezüglich Viren, Trojaner & Co. das ist. Kann ich mir da eher was einfangen als zB. mit einem Browser? Öffne ich zB. Viren damit gewissermaßen eine Tür?


jaenicke - Fr 20.12.24 13:45

Lücken in OpenSSL oder Indy könnte ein böser Download natürlich ausnutzen, aber meistens zielen Angriffe eher auf Browser. Lücken, bei denen ein einfacher Download einer URL ohne Browser für einen Angriff genügt, sind selten.

Dagegen tun kannst du aber ohnehin nicht viel, außer indem du die OpenSSL-DLLs immer aktuell hältst. Mit ICS könntest du auch die aktuellste Version nutzen, nicht nur die alte mit den neuesten Sicherheitsupdates.


galagher - Fr 20.12.24 19:04

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Lücken in OpenSSL oder Indy könnte ein böser Download natürlich ausnutzen,
Ich denke, für meine Zwecke - das Auslesen eines einzigen Satzes aus einem Text - wird Indy ausreichen. Downloads von Dateien etc. mache ich damit nicht.

Was ICS anlangt, habe mich da kurz informiert: https://stackoverflow.com/questions/2663494/indy-or-ics-or Werde ich nicht brauchen, weil - siehe oben!


jaenicke - Fr 20.12.24 21:03

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Lücken in OpenSSL oder Indy könnte ein böser Download natürlich ausnutzen,
Ich denke, für meine Zwecke - das Auslesen eines einzigen Satzes aus einem Text - wird Indy ausreichen. Downloads von Dateien etc. mache ich damit nicht.
Das ist nichts anderes als eine Datei. Es ist im Original eine Textdatei, aber ein Angreifer kann da genauso gut unter der URL Schadcode ausliefern. So einfach ist das ganze dann doch nicht.

Aber wie gesagt:
Ich halte das Risiko für sehr überschaubar, da das kein typischer Angriffsvektor ist.


galagher - So 22.12.24 11:00

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das ist nichts anderes als eine Datei. Es ist im Original eine Textdatei, aber ein Angreifer kann da genauso gut unter der URL Schadcode ausliefern.
Wusst' ich's doch: Die Welt ist böse! :twisted:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich halte das Risiko für sehr überschaubar, da das kein typischer Angriffsvektor ist.
Das ja immerhin etwas ist beruhigend.


jaenicke - So 22.12.24 11:32

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Wusst' ich's doch: Die Welt ist böse! :twisted:
Wenn es um Computersicherheit geht, darfst du erst einmal niemandem trauen, bevor du dich nicht vergewissert hast, dass der Mitspieler (Server, Benutzer, ...) der ist, der es vorgibt zu sein. Das Prinzip nennt sich Zero Trust.