API (wl-api.mf.gov.pl) i błąd 403 Forbidden.

0

Hej.
Używam Delphi XE6. Pobieram informacje z API (https://wl-api.mf.gov.pl/api/search/nips/) w następujący sposób:

    Request := TIdHTTP.Create(nil);
    LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    LHandler.SSLOptions.Method := sslvTLSv1_2;
    LHandler.SSLOptions.Mode := sslmUnassigned;
    Request.IOHandler := LHandler;
    Request.ReadTimeout := 10000;
    Request.ConnectTimeout := 10000;

    Result := Request.Get('https://wl-api.mf.gov.pl/api/search/nips/' + ANumeryNIP + '?date=' + FormatDateTime('yyyy-mm-dd', Date));

Jeszcze tydzień temu wszystko mi działało, a od wczoraj dostaję błąd "403 Forbidden". Gdy wywołuje ten sam URL w przeglądarce to normalnie działa i otrzymuję dane wynikowe.
Czy coś dodatkowego w tej chwili muszę ustawić aby działało pobieranie danych?

w Delphi XE6 wersja Indy, którą mam domyślnie zainstalowaną to 10.6.0.5122. Czy nagle ta wersja przestała działać?

1

Zobacz jak wygląda żądanie które przechodzi ci przez przeglądarkę i zrób żeby identyczne wychodziło od ciebie włącznie z nagłówkami, kodowaniem i innymi.


Mogły też zmienić się wymagane czynniki wejściowe, albo po prostu dostałeś bana za częste odpytywanie.

1

W Lazarus + Indy powyższy kod działa prawidłowo.

4

@jm0x01 a sprawdzałeś jaki wyjątek dostajesz? ;)

U mnie było tak:
screenshot-20240618173142.png

Po otwarciu ramki iframe (część od _Incapsula_Resource?CWUDNSAI=...) w przeglądarce masz ładnie wyjaśniony błąd:
screenshot-20240618173215.png

Poszukałem co to za błąd z tym "non-SPI connections" Okazuje się, że Indy do którejś tam wersji (około 2016 roku) nie obsługiwało SNI podczas połączeń SSL https://github.com/IndySockets/Indy/issues/160 https://www.indyproject.org/2016/01/10/client-side-sni-support-added-to-tidssliohandlersocketopenssl/ Ale zostało to naprawione. Masz trzy wyjścia:

  1. aktualizacja komponentów INDY do najnowszej wersji
  2. użycie innych komponentów do pobierania danych :)
  3. użycie obejścia jak tu https://stackoverflow.com/questions/39545080/tidhttp-and-tls-sni-doesnt-work wraz z samodzielnym wywołaniem funkcji SSL_set_tlsext_host_name

U mnie klienci zauważyli, ze przestało działać 13 czerwca. Chyba coś zmienili na serwerze i teraz takie połączenia bez włączonego rozszerzenia SNI są odrzucane.

0
  1. aktualizacja komponentów INDY do najnowszej wersji
  2. użycie innych komponentów do pobierania danych :)
  3. użycie obejścia jak tu https://stackoverflow.com/questions/39545080/tidhttp-and-tls-sni-doesnt-work wraz z samodzielnym wywołaniem funkcji SSL_set_tlsext_host_name

Cześć. Dzięk @Mr.YaHooo za konkretne podpowiedzi. Próbowałem użyć tego obejścia z wywołaniem funkcji SSL_set_tlsext_host_name, ale przy deklaracji procedury IdSSLIOHandlerSocketOpenSSL1StatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: Integer; const AType, AMsg: string);

niestety Delphi mi krzyczy, że nie wie co to jest const AsslSocket: PSSL.

Spróbowałem natomiast połączyć się z API w DELPI XE (w DELPHI XE mam INDY w wersji 10.6.2.5519) i tutaj połączenie przechodzi bez problemu.
Będę musiał zatem zaktualizować Indy w DELPHI XE6 do nowszej wersji.
Nigdy dotąd nie aktualizowałem Indy. Czy nie zepsuję sobie podczas aktualizacji w delphi xe6 tej wersji, którą mam obecnie w delphi xe? Zarówno XE i XE6 mam zainstalowane na tym samym komputerze.

1

To type PSSL = ^SSL; zdefiniowane w IdSSLOpenSSLHeaders.

0
jm0x01 napisał(a):

Cześć. Dzięk @Mr.YaHooo za konkretne podpowiedzi.

Nie ma za co :)

jm0x01 napisał(a):

Nigdy dotąd nie aktualizowałem Indy. Czy nie zepsuję sobie podczas aktualizacji w delphi xe6 tej wersji, którą mam obecnie w delphi xe? Zarówno XE i XE6 mam zainstalowane na tym samym komputerze.

Z tego co mi wiadomo, to daną wersję instaluje się w obrębie danego IDE, więc nie powinieneś niczego sobie zepsuć. Przecież instalacja odbywa się w katalogu danego IDE, a XE i XE6 mają różne katalogi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1