Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.06.22 12:26 
Hallo an alle,

nun stelle ich nach langer Zeit auch mal wieder eine Frage. ;-)

Gegeben ist folgende (für die Demo stark vereinfachte) Konstellation:
- Visual Studio 2022
- C# Klassenbibliothek mit DllExport via NuGet geladen
- Nativ exportierte DLL-Funktion, in der ein HttpClient eine Datei via SSL herunterlädt
- Delphi-Programm, das diese DLL lädt und die Funktion ausführt

Leider bekomme ich dabei einen SSL Fehler:
Zitat:
---> (Interne Ausnahme #0) System.Net.Http.HttpRequestException: Fehler beim Senden der Anforderung. ---> System.Net.WebException: Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden..


Das Interessante daran ist nun, dass der exakt identische Quelltext in einer Windows Forms App (identisch mit .NET Framework 4.8 usw.) normal funktioniert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
            MessageBox.Show("Vorher");
            HttpClient _httpClientDefault = new HttpClient();
            try
            {
                string DD_jwt = _httpClientDefault.GetStringAsync($"https://file-examples.com/storage/fe6869c4db62a7ab6a021f9/2017/02/file_example_XML_24kb.xml").Result;
                MessageBox.Show("Ergebnis: " + DD_jwt);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler: " + ex.ToString());
            }
            MessageBox.Show("Nachher");


Die ausführbaren Binaries sind dabei, falls jemand z.B. das Delphiprojekt nicht selbst kompilieren kann / möchte. Es liegt fertig kompiliert unter:
Zitat:
HttpClientError\DelphiHost\Win32\Release

Dieses lädt die C#-DLL aus, die ebenfalls beiliegt:
Zitat:
HttpClientError\HttpClientErrorLib\HttpClientErrorLib\bin\Debug\net48

Die funktionierende C# Anwendung liegt hier:
Zitat:
HttpClientError\HttpClientErrorLib\HttpClientErrorExe\bin\Debug


Es sind alle Projekte und Quelltexte mit dabei, es sollte sich also problemlos nachvollziehen lassen. Dafür reicht es den Knopf in der Delphi-Anwendung bzw. der C# Anwendung zu drücken.

Leider habe ich nicht die leiseste Idee was hier das Problem sein kann. Ihr vielleicht?

Danke schon einmal für eure Hilfe!

Viele Grüße
Sebastian
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 14.06.22 14:05 
Hallo Sebastian,

ich erhalte auch bei deiner Delphi-Version den SSL/TLS-Fehler, während die C#-Applikation die XML-Datei anzeigt.

Überprüfe mal mittels des ServicePointManager.ServerCertificateValidationCallback (SslPolicyErrors), s.a. Could not create SSL/TLS secure channel, despite setting ServerCertificateValidationCallback (zum Test einfach mal immer true zurückgeben). Oder wie dort auch vorgeschlagen, mal explizit die benötigte SSL-Version im SecurityProtocol angeben.

Evtl. wird bei dem Delphi-Programm (als Host-Programm) eine andere SSL-Version verwendet?

Für diesen Beitrag haben gedankt: jaenicke
jaenicke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.06.22 14:20 
Danke schon einmal!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
ich erhalte auch bei deiner Delphi-Version den SSL/TLS-Fehler, während die C#-Applikation die XML-Datei anzeigt.
Das ist genau mein Problem:
Wenn ich in C# eine Exe erstelle, klappt es, erstelle ich eine Klassenbibliothek mit DLL Export, der aus dem Delphiprogramm heraus aufgerufen wird, geht es nicht.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Überprüfe mal mittels des ServicePointManager.ServerCertificateValidationCallback (SslPolicyErrors), s.a. Could not create SSL/TLS secure channel, despite setting ServerCertificateValidationCallback (zum Test einfach mal immer true zurückgeben). Oder wie dort auch vorgeschlagen, mal explizit die benötigte SSL-Version im SecurityProtocol angeben.
Das schaue ich mir an.

// EDIT: Der Callback macht leider keinen Unterschied.

// EDIT2:
Aber tatsächlich klappt es, wenn ich die Versionen angebe. Da scheint dann wohl ein anderer Standardwert verwendet zu werden.
Vielen Dank, das klappt nun!


user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Evtl. wird bei dem Delphi-Programm (als Host-Programm) eine andere SSL-Version verwendet?
Das ist exakt der gleiche Quelltext. Delphi lädt lediglich die in C# geschriebene DLL und ruft die Funktion darin auf. Du kannst diese DLL auch selbst neu kompilieren. Alle drei Projekte (Delphi-Host, C#-DLL und C#-Exe) liegen in dem Archiv. In Delphi selbst passiert gar nichts außer der Aufruf der DLL Funktion.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 14.06.22 15:15 
Das Framework wählt so aus irgendeinem Grund die alten Defaults für Frameworks kleiner 4.5.1. als wüsste es nicht das es das Framework 4.8 benutzen sollte.
Per config lässt sich das Framework aber wieder in die richtige Richtung schubsen so das die Systemeinstellungen genutzt werden.

Folgendes als "DelphiHost.exe.config" sollte funktionieren.

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
  </startup>
  <runtime>
        <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
  </runtime>
</configuration>
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 14.06.22 15:17 
Schön, daß es jetzt funktioniert.

Und genau das meinte ich, daß jede der beiden Anwendungen unterschiedliche Standardwerte für die SSL-Version nutzt.
jaenicke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.06.22 23:27 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Per config lässt sich das Framework aber wieder in die richtige Richtung schubsen so das die Systemeinstellungen genutzt werden.

Folgendes als "DelphiHost.exe.config" sollte funktionieren.
Gut zu wissen, darauf wäre ich in dem Zusammenhang nicht gekommen.

Ja, vielen Dank noch einmal an euch beide.