![]() |
TIDHTTP - Open SSL - TLS
Ich verbinde mich üher TIDHTTPS an verschiedene URLs um Bilder zu downloaden bei
MIME emails. Leider klappt die Verbindung nur sporadisch. Ich habe zur TIDHTTP-Komponente eine TIDSSLIOHandlerSocketOpenSSL-Komponente hinzugefügt.
Delphi-Quellcode:
Beim Verbinden kommen veschiedene Fehlermeldungen, je nach Web-Adresse, wie gesagt,
IOHandler.Method := sslvTLSv1_2;
IOHandler.Mode := sslmClient; beim manchen gehts auch :-) z.B. Fehler beim Verbinden mit SSL. error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number oder HTTP/1.1 403 Forbidden Ich habe mir die neuesten DLL-Dateien ssleay32.dll und libeay32.Dll heruntegeladen und in das Programmverzeichnis gelegt, von wo aus die exe gestartet wird. Ich hab null Plan woran es liegt. Muss ich beim Verbinden beim WebServer sozusagen nachfragen, welche Verschlüsselung er haben möchte? Oder geht das automatisch ist TLS nicht abwärtskompatibel? Wenn ich einen 64Bit-Rechner habe, aber Delphi in 32Bit kompiliert, brauche ich dann die 32-bit oder 64-bit dlls? Habe Indy 10.6 Oder kann es sein, dass er sich auf meinem Rechner doch doch alte dlls rausfischt? Ich habe nämlich auch noch in anderer Software von Fremdanbietern die dlls in verschiedenen Verzeichnissen. |
AW: TIDHTTP - Open SSL - TLS
Mit SSLOptions.Method := sslvTLSv1_2 wird nur TLS 1.2 unterstützt. Server die stattdessen noch TLS 1.1 (oder bereits TLS 1.3 erwarten), werden nicht mit dem Client zusammenarbeiten.
Um sowohl TLS 1.1. als auch TLS 1.2 zu erlauben muss SSLOptions.SSLVersions verwendet werden. Alle für die Verbindungen erlaubten TLS Versionen können damit angegeben werden. Beispiel:
Delphi-Quellcode:
SSLOptions.SSLVersions := [sslvTLSv1_1,sslvTLSv1_2]
Welche Versionen der jeweilige Server unterstützt läßt sich mit online- und offline Tools herausfinden, dazu lassen sich im Netz viele Beispiele finden. Die DLLs müssen der von Delphi erstellten Bittigkeit entsprechen, bei 32 Bit Anwendungen also 32 Bit DLLs. |
AW: TIDHTTP - Open SSL - TLS
Vielleicht hilft dir diese Klasse die ich seit Jahren benutze
Delphi-Quellcode:
unit uHTTP;
interface uses System.Classes, IdHTTP, IdSSLOpenSSL; type TuHTTP= class(TIdHTTP) private FIOHndl: TIdSSLIOHandlerSocketOpenSSL; public constructor Create; destructor Destroy; override; end; implementation constructor TuHTTP.Create; begin inherited; FIOHndl := TIdSSLIOHandlerSocketOpenSSL.Create(nil); Request.BasicAuthentication := True; HandleRedirects := True; ReadTimeout := 3000; ConnectTimeout := 3000; FIOHndl.ReadTimeout := 3000; FIOHndl.ConnectTimeout := 3000; FIOHndl.SSLOptions.SSLVersions := [sslvTLSv1_2]; IOHandler := FIOHndl; end; destructor TuHTTP.Destroy; begin FIOHndl.Free; inherited; end; end.
Delphi-Quellcode:
var HTTP: TuHTTP; HTTP := TuHTTP.Create; try s := HTTP.Get( URL ); finally HTTP.Free; end; |
AW: TIDHTTP - Open SSL - TLS
Zitat:
Delphi-Quellcode:
Manche Seiten gehen, diese hier z.B. nicht (ich stelle sie mal hier hin, ist es nur Werbe-Bild ;-)
SSLHandler.Port := 443;
SSLHandler.SSLOptions.Method := sslvSSLV23; //gar nichts lässt sich im OI nicht einstellen SSLHandler.SSLOptions.Mode := sslmUnassigned; SSLHandler.SSLOptions.SSLVersions := [sslvSSLv2,sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]; ![]() Ich erhalte folgede Fehlermeldung: Fehler beim Verbinden mit SSL. error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol Liegt es evtl. doch an der ssleay32.DLL oder der libeay32.dll, dass er sich vielleicht eine andere holt, als die, die neben der Exe liegt im Projektverzeichnis? @strict: Request.BasicAuthentication := True; da kommt dann als Antwort 401 - Bad Request |
AW: TIDHTTP - Open SSL - TLS
Hingedaddelt mal einfach sowas probieren:
Delphi-Quellcode:
Es passiert in etwa folgendes:
function GetSSLMethod(sUrl: string; var sMessage: string; ssl: TIdSSLIOHandlerSocketOpenSSL; http: TIdHTTP): Integer;
var myIdSSLVersion: TIdSSLVersion; begin Result := -1; for myIdSSLVersion := Low(TIdSSLVersion) to High(TIdSSLVersion) do begin SSL.SSLOptions.Method := myIdSSLVersion; try http.RedirectMaximum := 0; http.HandleRedirects := false; http.Response.Clear; http.Get(sUrl); http.Disconnect(True); http.IOHandler.InputBuffer.Clear; Result := Ord(myIdSSLVersion); break; except on e: Exception do begin case http.ResponseCode of 301, 302 : sMessage := sMessage + #13 + http.ResponseText; else sMessage := sMessage + #13 + AnsiReplaceText(e.Message, #13#10, ' '); end; http.Disconnect(True); http.IOHandler.InputBuffer.Clear; end; end; end; end; Es werden in einer Schleife alle SSL-Version durchprobiert, bis zur ersten funktionierenden. Die kann dann zur weiteren Verarbeitung genutzt werden. Ist der Rückgabewert der Funktion -1, so konnte keine funktionierende SSL-Version ermittelt werden. images.trckacbm.com nutzt das von Dir gewählte Protokoll nicht, sondern nur TLS 1.2 und TLS 1.1, von daher ist die Fehlermeldung absolut korrekt und hat nichts mit lokalen DLLs zu tuen. U. a. dort kannst Du prüfe lassen, welche Protokolle genutzt werden können: ![]() |
AW: TIDHTTP - Open SSL - TLS
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Delphi.Narium für die Funktion GetSSLMethod
Es hilft schon weiter, leider gehts immer noch nicht. Ich habe mal einen Screenshot des Ergebnisses drangehängt. Er macht ja 6 Durchläufe, wenn er nichts findet. Es ist übrigens das Ergebnis von dem Link oben..eigentlich müsste ja mindestens TLS 1_2 funktionieren.. Habe zwar keine Ahnung aber ist es richtig, dass er da 4 Mal die SSL3 auflistet und kein TLS? Fehlt mir da was in meiner Installation? Version 1 : SSL_CTX Version 2 : SSL_23 Version 3 : SSL_3 Version 4-6 auch SSL_3 - müsste das nicht TLS 1, TLS 1_1 und TLS 1_2 sein? |
AW: TIDHTTP - Open SSL - TLS
Frag mal bitte im Exceptionblock weitere Fehler ab, die da u. a. wären:
Delphi-Quellcode:
Das Problem der Routine scheint nicht (nur) das Nichtfinden der SSL-Version zu sein, sondern bei erfolgreich gefundener SSL-Version folgt anschließend Fehler 403 und man landet damit auch in der Fehlerbehandlung.
except
on e: Exception do begin case http.ResponseCode of 301, 302 : sMessage := sMessage + #13 + http.ResponseText; 403 : begin sMessage := http.ResponseText; Result := Ord(myIdSSLVersion); break; end; else sMessage := sMessage + #13 + http.ResponseText + #13 + AnsiReplaceText(e.Message, #13#10, ' '); end; http.Disconnect(True); http.IOHandler.InputBuffer.Clear; end; end; Jedenfalls funktionieren bei mir sslvTLSv1_1 und sslvTLSv1_2, wie zu erwarten wäre. |
AW: TIDHTTP - Open SSL - TLS
Es kommt bei der Exception kein Fehler 403.
Der Responsetext bleibt auch bei allen Versionen leer. |
AW: TIDHTTP - Open SSL - TLS
Und was sagt der ResponseCode?
|
AW: TIDHTTP - Open SSL - TLS
Der ResponseCode ist jedesmal -1
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz