AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi REST Request Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

REST Request Fehler

Ein Thema von t2000 · begonnen am 11. Jan 2021 · letzter Beitrag vom 21. Jan 2024
Antwort Antwort
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: REST Request Fehler

  Alt 11. Jan 2021, 14:19
Wie oben beschrieben, habe ich nur die Tokyo-Sourcen vorliegen.
Ich nehme an, da hat sich zwei Versionen weiter schon was getan.

Ich vermute, dass du den Fehler in TWinHTTPClient.DoExecuteRequest bekommst.
Also beim Senden des Requests mit WinHttpSendRequest.

Das ist in Tokyo wie folgt gelöst (Zeile 855 ff. aus System.Net.HttpClient.Win):

Delphi-Quellcode:
  // Send Request
  LRes := WinHttpSendRequest(LRequest.FWRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, LDataLength, 0);
  if not LRes then
  begin
    LastError := GetLastError;
    case LastError of
      ERROR_WINHTTP_SECURE_FAILURE:
        Exit(TExecutionResult.ServerCertificateInvalid);
      ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED:
        Exit(TExecutionResult.ClientCertificateNeeded);
      else
        raise ENetHTTPClientException.CreateResFmt(@SNetHttpClientSendError, [GetLastError, SysErrorMessage(GetLastError, GLib.Handle)]);
    end;
  end;
Vom Fehlertext her, bekommst du ja einen ERROR_WINHTTP_SECURE_FAILURE ("Es ist ein Sicherheitsfehler aufgetreten").
Das wurde hier in 10.2 Tokyo noch mit einem einfachen Enum-Wert als Rückgabe gelöst.

Ich könnte mir vorstellen, dass dies in 10.4 Sydney auf den ENetHTTPClientException.CreateResFmt geht.
Denn SNetHttpClientSendError = 'Fehler beim Senden der Daten: (%d) %s'; ist der mittlere Teil deiner Fehlermeldung.
Der vordere Teil (sRESTRequestFailed) kommt aus dem except-Block von TCustomRESTRequest.Execute (Rest.Client),
Delphi-Quellcode:
        // Unknown error, might even be on the client side. raise it!
        on E: Exception do
        begin
          // If Execute raises an Exception, then the developer should have look into the actual BaseException
          raise ERESTException.CreateFmt(sRESTRequestFailed, [E.Message]);
        end;
Wie dem auch sein, für ERROR_WINHTTP_SECURE_FAILURE sagt die MSDN (https://docs.microsoft.com/en-us/win...psendrequest):
Zitat:
One or more errors were found in the Secure Sockets Layer (SSL) certificate sent by the server.
To determine what type of error was encountered, verify through a WINHTTP_CALLBACK_STATUS_SECURE_FAILURE notification in a status callback function.
For more information, see WINHTTP_STATUS_CALLBACK.
Was uns hierzu führt: https://docs.microsoft.com/en-us/win...tatus_callback
Du könntest also durch das setzen einer Callback mehr Information erhalten, warum es bei dir scheitert (via WinHttpSetStatusCallback -> https://docs.microsoft.com/en-us/win...statuscallback).

In Tokyo ist dafür nichts vorgesehen bzw. ist das in TWinHTTPClient.Create auskommentiert.
Entweder gibt es in Sydney dann Möglichkeiten dafür ODER du kopierst dir die System.Net.HttpClient.Win in dein Projekt und veränderst sie entsprechend, um mehr Informationen loggen zu können.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: REST Request Fehler

  Alt 11. Jan 2021, 15:04
Meine obige Idee noch schnell skizziert. Wie geschrieben die System.Net.HttpClient.Win Unit kopieren und dem eigenen Projekt hinzufügen, um Änderungen vornehmen zu können:

Delphi-Quellcode:
procedure HTTPCallback(hInternet: HINTERNET; dwContext: Pointer; dwInternetStatus: DWORD;
    lpvStatusInformation: Pointer; dwStatusInformationLength: DWORD); stdcall;
var
// LRequest: TWinHTTPRequest;
  StatusFlags: DWORD;
  Flag: DWORD;

  function FlagToString(Flag: DWORD): string;
  begin
    case Flag of
       WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED : Result := 'CERT_REV_FAILED';
       WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT : Result := 'INVALID_CERT';
       WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED : Result := 'CERT_REVOKED';
       WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA : Result := 'INVALID_CA';
       WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID : Result := 'CERT_CN_INVALID';
       WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID : Result := 'CERT_DATE_INVALID';
       WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE : Result := 'CERT_WRONG_USAGE';
       WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR : Result := 'SECURITY_CHANNEL_ERROR';
    end;
  end;

  procedure CheckFlags(Value, Flag: DWORD);
  begin
    if (Value and Flag) = Flag then
      Writeln(Flag.ToHexString, Format(' %s is in lpvStatusInformation', [FlagToString(Flag)]));
  end;

begin
  AllocConsole;
  case dwInternetStatus of
    WINHTTP_CALLBACK_STATUS_SECURE_FAILURE:
    begin
// LRequest := TWinHTTPRequest(dwContext);
      StatusFlags := PDWORD(lpvStatusInformation)^;

      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE);
      CheckFlags(StatusFlags, WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR);
    end;
  end;
end;

constructor TWinHTTPClient.Create;
begin
  inherited Initializer;

  FWinCertList := TList<PCCERT_CONTEXT>.Create;
  FCertificateList := TList<TCertificate>.Create;

  GLib.LockHandleGC;
  FWSession := WinHttpOpen('', WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
  if FWSession = nil then
    raise ENetHTTPClientException.CreateRes(@SNetHttpClientHandleError);

  WinHttpSetStatusCallback(FWSession, HTTPCallback, WINHTTP_CALLBACK_STATUS_SECURE_FAILURE, 0); // das ist neu!
end;
Statt einer Console kann natürlich ein beliebiger anderer Logging-Mechanismus verwendet werden.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.911 Beiträge
 
Delphi 12 Athens
 
#3

AW: REST Request Fehler

  Alt 11. Jan 2021, 15:04
In Tokyo ist dafür nichts vorgesehen bzw. ist das in TWinHTTPClient.Create auskommentiert.
Entweder gibt es in Sydney dann Möglichkeiten dafür ODER du kopierst dir die System.Net.HttpClient.Win in dein Projekt und veränderst sie entsprechend, um mehr Informationen loggen zu können.
Das wurde mit Delphi 10.3 überarbeitet. Dort gibt es nun ein entsprechendes Callback, das die Auswertung übernimmt und in der Property SecureFailureReasons ablegt.

Es wurden auch diverse Routinen zur Auswertung von Zertifikaten usw. hinzugefügt.

// EDIT:
Ja, so ähnlich sieht die Callbackfunktion HTTPCallback auch in der RTL nun aus.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000
Online

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#4

AW: REST Request Fehler

  Alt 11. Jan 2021, 15:28
Ja, in 10.4.1 so:

in System.Net.HttpClient.Win
Delphi-Quellcode:
  // Send Request
  if not WinHttpSendRequest(LRequest.FWRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, LDataLength, 0) then
    Exit(HandleExecuteError(@SNetHttpClientSendError, ARequest));
und dann:

Delphi-Quellcode:
function TWinHTTPClient.HandleExecuteError(AErrorMsg: PResStringRec; const ARequest: THTTPRequest): TWinHTTPClient.TExecutionResult;
var
  LastError: Cardinal;
begin
  LastError := GetLastError;
  case LastError of
    ERROR_WINHTTP_SECURE_FAILURE:
      if (SecureFailureReasons <> [THTTPSecureFailureReason.SecurityChannelError]) and
         not TWinHTTPRequest(ARequest).FServerCertificateAccepted then
        Exit(TExecutionResult.ServerCertificateInvalid)
      else
        raise ENetHTTPClientException.CreateResFmt(AErrorMsg, [LastError, SysErrorMessage(LastError, TWinHttpLib.Handle)]);
    ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED:
      Exit(TExecutionResult.ClientCertificateNeeded);
    ERROR_WINHTTP_RESEND_REQUEST:
      Exit(TExecutionResult.Retry);
    else
      if (LastError = ERROR_WINHTTP_OPERATION_CANCELLED) and
         (SecureFailureReasons = [THTTPSecureFailureReason.CertNotAccepted]) then
        raise ENetHTTPCertificateException.CreateRes(@SNetHttpServerCertificateNotAccepted)
      else
      if (LastError = ERROR_WINHTTP_OPERATION_CANCELLED) or TWinHTTPRequest(ARequest).FCancelled then
        Exit(TExecutionResult.Success)
      else
        raise ENetHTTPClientException.CreateResFmt(AErrorMsg, [LastError, SysErrorMessage(LastError, TWinHttpLib.Handle)]);
  end;
end;
Ich habe nun aber erstmal damit zu tun, dass über das Provisorium die Daten alle rüber kommen. Dauert ein wenig. Danach spreche ich mit dem Kunden, ob dasa Provisorium noch 6 Wochen laufen oder wir weiter suchen sollen. Kostet ja alles Geld.

Vielen Dank nochmal, falls ich die Tage etwas Zeit habe, mache ich mir ein Testprogramm.
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Benutzerbild von t2000
t2000
Online

Registriert seit: 15. Dez 2005
Ort: NRW
247 Beiträge
 
Delphi 12 Athens
 
#5

AW: REST Request Fehler

  Alt 21. Jan 2024, 15:10
Wir hatten das Problem gerade wieder.

REST Abfrage auf Woocommerce Shop mit original Delphi Komponenten.
Gleichzeitig auf mehreren PC's.
Nur auf einem Windows 11 PC hat alles nach wie vor funktioniert.

Grund war folgender:
Auf dem Webserver, auf dem der Woocommerce Shop installiert ist, wurden verschiedene Updates eingespielt.
Anschließend einige Einstellungen überprüft. U.a. auch die SSL/TLS Einstellungen vom Server. Diese sollten regelmäßig synchronisiert werden.
Warum auch immer, die Einstellungen standen auf "modern". Das bedeutet, das nur TLS 1.3 erlaubt ist.

Unsere Testsystem auf Clientseite waren folgende:
Windows Server 2012 R2
Windows Server 2019
Windows 10
Windows 11

Das Programm, welches den REST Aufruf macht, war von 2021 und mit Delphi 10.4.1 kompiliert.
Gleichzeitig haben wir aber auch eine Version ganz neu mit Delphi 11.3 kompiliert und auch getestet.
Schon mal vorweg, es gab keinerlei Unterschiede zwischen der 2021er Version und heute.

Von den 4 Testsystemen lief nur Windows 11. Die 3 anderen System haben die Fehlermeldung gebracht.

Nun haben wir den Webserver auf "ausgewogen" gestellt. Also die mittlere Einstellung. Bei der ist TLS 1.2 und TLS 1.3 aktiv.

Gleiches Spiel auf allen 4 Testsystemen.

Nächster Test, Webserver auf "alt" eingestellt. Jetzt sind TLS 1.0 - TLS 1.3 verfügbar.

Alle System laufen wieder.
Egal ob in 2021 kompiliert oder aktuell.

Daneben haben wir natürlich verschieden Tests mit Einstellungen auf den Client PC's gemacht.
1) PC Internetoptionen verschieden Einstellungen TLS ausprpbiert
2) Delphi REST-Client Komponente Security Einstellung TLS 1.0 - 1.3 ausprobiert.

All das hat überhaupt keine Auswirkung gehabt.

Was bewirken die Einstellungen auf dem PC?
Was bewirken die Einstellungen in der REST Client Komponente?

Wie sind die zu nutzen?

Ich glaube, ich habe hier noch einige Wissenslücken.

Ich würde gerne den Webserver zumindest auf TLS 1.2 stellen ("ausgewogen"). Aber das bekomme ich nicht zum laufen.

Hier noch 2 Bilder von den PLESK Einstellungen auf dem Webserver.

Vielleicht hat ja noch mal jemand eine Idee.

Danke.
Viele Grüße
Thomas



Angehängte Grafiken
Dateityp: jpg Screenshot 2024-01-21 155255.jpg (74,7 KB, 43x aufgerufen)
Dateityp: png Screenshot 2024-01-21 155323.png (132,9 KB, 43x aufgerufen)
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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