Autor Téma: Delphi + EET  (Přečteno 98067 krát)

Offline peta.dol

  • Nováček
  • *
  • Příspěvků: 13
  • Karma: 0
    • Verze Delphi: XE3
Re:Delphi + EET
« Odpověď #315 kdy: 03-01-2017, 10:29:51 »
upravil jsem tedy:
    TxmlSecCryptoAppKeyLoad = function(const filename: PAnsiChar; format: xmlSecKeyDataFormat; const pwd: PAnsiChar;
        pwdCallback: Pointer; pwdCallbackCtx: Pointer): xmlSecKeyPtr; cdecl;

nefunguje:     
dsigCtx.signKey := xmlSecCryptoAppKeyLoad(PAnsiChar('cert_diak.pfx'), xmlSecKeyDataFormatPkcs12,
            PAnsiChar('Vyš2'), nil, nil);

bez diakritiky je to ok:     
dsigCtx.signKey := xmlSecCryptoAppKeyLoad(PAnsiChar('cert_nodiak.pfx'), xmlSecKeyDataFormatPkcs12,
            PAnsiChar('Vys2'), nil, nil);

zkoušel jsem to i jako:
s: array of byte;
56 79 9A 32 00 (Vyš2)
ale taky nic...

Můžete mi někdo potvrdit, že Vám to s diakritikou funguje? Případně poslat knihovny se kterými vám to jede a způsob jak to voláte? Díky..


Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1539
  • Karma: 37
    • Pepak.net
Re:Delphi + EET
« Odpověď #316 kdy: 03-01-2017, 10:59:20 »
Excellent
Rated 1 time
PAnsiChar('Vyš2') ti neudělá kódování UTF8...

Offline peta.dol

  • Nováček
  • *
  • Příspěvků: 13
  • Karma: 0
    • Verze Delphi: XE3
Re:Delphi + EET
« Odpověď #317 kdy: 03-01-2017, 12:32:50 »
zkusil jsem i UTF8:
s: RawByteString;

s := AnsiToUtf8('Vyš2');
dsigCtx.signKey := xmlSecCryptoAppKeyLoad(PAnsiChar('cert_diak.pfx'), xmlSecKeyDataFormatPkcs12,PAnsiChar(s), nil, nil);
v paměti je:
56 79 C5 A1 32 00

ale opět nefunguje...

Offline Roman Č.

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: Delphi 7, XE2, 10.2 Tokyo
Re:Delphi + EET
« Odpověď #318 kdy: 12-01-2017, 10:38:21 »
Kolegové profíci, se SOAP mám minimální zkušenosti, HTTPS, SSL a certifkáty obecně jsou moje noční můra. Nicméně stát si to žádá, tak není úniku. Zkouším zkompilovat projekt od Miruse (za zdroje velice a upřímně děkuji) v Delphi XE2 (USE_INDY) a potřebuji odeslat zprávu na EET přes SOAP. Mám jen Indy 10.5.8.0, kde je TIdSSLVersion = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1); - tedy bez sslvTLSv1_1 a sslvTLSv1_2. Nastavil jsem tedy v constructor TEETRIO.Create(AOwner: TComponent);   SSLOptions.Method := sslvTLSv1; a SSLOptions.SSLVersions := [sslvTLSv1];
Projekt se mi podaří zkompilovat a spustit, ale při pokusu o odeslání dostávám
Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
Asi to od Vás profíků schytám, ale přesto to zkusím: můžete mi někdo poradit, jak toto vyřešit, co je špatně?
Díky...

Offline Marek Weyda

  • Hrdina
  • ****
  • Příspěvků: 257
  • Karma: 8
    • Verze Delphi: Delphi 2007, 10.1 Berlin
Re:Delphi + EET
« Odpověď #319 kdy: 12-01-2017, 11:02:49 »
Asi to od Vás profíků schytám, ale přesto to zkusím: můžete mi někdo poradit, jak toto vyřešit, co je špatně?
Díky...

No, když uvedené chybové hlášení zadám do Googlu, tak mi to najde celkem docela dost diskuzí o této chybě, tak bych to asi zkusil jako první tam.

Jinak ale osobně doporučuji, pokud netrváte na Windows XP, nepoužívat Indy, ale WinInet. EET nám jede už u několika klientů a naprosto bez problémů. Od Indy postupně upouštíme, štve mě tak hodně věcí, ale o tom by bylo další diskuzní vlákno.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 229
  • Karma: 9
    • Verze Delphi: XE6, Delphi 10.2 Tokyo
Re:Delphi + EET
« Odpověď #320 kdy: 12-01-2017, 13:07:51 »
Špatně je to, že se pokoušíš navázat spojení se serverem pomocí TLS v. 1.0, ale server podporuje 1.1 nebo vyšší. Viz dokumentace:
"Podporované verze TLS jsou TLS 1.1 a vyšší, doporučená verze TLS je 1.2."

Pokud trváš na Indy, můžeš jedině přeinstalovat Indy na verzi s TLS 1.1 nebo 1.2. Nebo použít WinInet, jak ti radil Marek Weyda. Pomocí Indy dosáhneš jedině toho, že budeš mít podporu TLS 1.1 nebo 1.2 i na Win XP, které už dnes nepodporuje opravdu nikdo.
K.
Win10 Prof 64b, Firebird 2.5

Offline Roman Č.

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: Delphi 7, XE2, 10.2 Tokyo
Re:Delphi + EET
« Odpověď #321 kdy: 12-01-2017, 14:45:33 »
Pánové díky za tipy.
Citace
No, když uvedené chybové hlášení zadám do Googlu, tak mi to najde celkem docela dost diskuzí o této chybě, tak bych to asi zkusil jako první tam.
Věřte mi, několik dlouhých hodin jsem nedělal nic jiného. Většinou jsem narazil na pro mne složité odpovědi, ze kterých jsem pouze vydedukoval, že možná upgrade Indy by mohl pomoci, jak píše KarelHorky. Nedošlo mi ale, že sslvTLSv1 je vlastně verze TLS v. 1.0, nikoliv TLS v. 1.1. Pak je to asi zřejmé, co se děje.
Takže jsem se dostal k další poznámce:
Citace
Pokud trváš na Indy, můžeš jedině přeinstalovat Indy na verzi s TLS 1.1 nebo 1.2.
Ano, našel jsem, že je možné použít nové Indy, ale zase jsem obratem také našel, že pokud se ho pokusím přeinstalit v mých Delphi XE2, přestane mi fungovat spousta dalších věcí - jednoduše to prý není možné. Takže jsem se neodvážil toto podstoupit.
Jelikož ale opravdu Win XP nepotřebuji, zkusil jsem tu druhou cestu USE_LIBEET - tedy přes WinInet - a POZOR - po drobných úpravách kódu pro XE2 se kompilace i přenos se podařil!!!

Takže díky díky !!!

Bohužel mám ale další starost. Jeden projekt mám v Delphi 7. Je bohužel docela rozsáhlý, jeho přepis do XE2 je časově neřešitelný. Naneštěstí řešení Miruse přes WinInet (o Indy ani nemluvím) nejde vůbec zkompilovat pod D7, prostě z důvodu mnoha nekompatibilit.

Takže se ptám: rozchodil někdo EET pod Delphi 7? Především tedy myslím samotný přenos zprávy přes TLS 1.1. Opět dopředu moc děkuji za Váš čas.

Offline Peťo

  • Nováček
  • *
  • Příspěvků: 36
  • Karma: 3
    • Verze Delphi: 7, 5, 4
Re:Delphi + EET
« Odpověď #322 kdy: 12-01-2017, 15:04:00 »
Bohužel mám ale další starost. Jeden projekt mám v Delphi 7. Je bohužel docela rozsáhlý, jeho přepis do XE2 je časově neřešitelný. Naneštěstí řešení Miruse přes WinInet (o Indy ani nemluvím) nejde vůbec zkompilovat pod D7, prostě z důvodu mnoha nekompatibilit.

Takže se ptám: rozchodil někdo EET pod Delphi 7? Především tedy myslím samotný přenos zprávy přes TLS 1.1. Opět dopředu moc děkuji za Váš čas.
Áno, dá sa to. Mirusove riešenie DelphiEET sa mi podarilo upraviť, aby pod Delphi 7 išlo skompilovať a fungovalo cez WinInet (Indy som neskúšal). Bolo nutné zmeniť viaceré deklarácie a vygoogliť nejaké v D7 neexistujúce funkcie. Mám takto upravenú iba staršiu verziu DelphiEET, na budúci týždeň sa chystám upraviť aktuálnu vylepšenú verziu a konečne to dopracovať do aplikácie, lebo kritický mesiac 03/2017 sa blíži.

Offline Marek Weyda

  • Hrdina
  • ****
  • Příspěvků: 257
  • Karma: 8
    • Verze Delphi: Delphi 2007, 10.1 Berlin
Re:Delphi + EET
« Odpověď #323 kdy: 12-01-2017, 15:32:22 »
Takže se ptám: rozchodil někdo EET pod Delphi 7? Především tedy myslím samotný přenos zprávy přes TLS 1.1. Opět dopředu moc děkuji za Váš čas.

Tak u nás se EET zanalyzovalo a naprogramovalo vlastními silami, ostatní projekty (i od zmíněného Mirus, což je určitě dost dobrý projekt, jak jsem koukal a už jsem ho tady kdysi chválil) jsem prolétl jenom letem světem, jak to kdo řešil pouze pro zajímavost a potvrzuji, že lze udělat naprosto funkční řešení (potvrzeno tisíci logy u našich zákazníků) pod Delphi 2007 s tím, že SOAP komunikace se musí ale opravdu upravit, toto pod Delphi 2007 ještě nebylo dobře vyřešené. Takže jsem si brutálně upravil SOAP unity alá moderní Delphi. Bohužel jsem nemohl programovat ve verzi 10.1 Berlin, což bych nejraději, musel jsem prostě se ohlížet na možnosti toho, kým jsem placen, který zatím projekt nemá migrovaný z Delphi 2007 do nejnovějších Delphi, byť se na tom intenzivně dělá.

Takže pokud je funkční řešení Delphi 2007 + WinInet, musí být funkční i Delphi 7 + WinInet si myslím. Já ale za sebe 100 procentně potvrzuji opravdu funkční řešení Delphi 2007 + WinInet.

Osobně jsem daleko více času než SOAP, SSL, certifikáty a další lahůdky, tak daleko více času mi zabral složitý systém logování EET, aby to bylo legislativně opravdu na 100 procent a případná kontrola finančáku nestála naše klienty zbytečné peníze na pokutách. Takže jsem si vyhrál spíše než se samotnou komunikací tak s tím, jak ošetřit všechny možné chybové stavy, nová zaslání a další. Naší analytičku zase potrápilo to, že naši klienti jsou ze všech oborů, takže museli jsme do EET zapracovat všechny ty vymoženosti, jak už jsme o tom tady diskutovali. Takže na březen 2017 si myslím, že jsme už připravený, jediné, čeho se v březnu obávám, že tam najednou začne chodit daleko více (podle mě o opravdu hodně) dokladů, takže jsem na Ministerstvo financí zvědavý, jak to ustojí. Teď nemám v logu jediný záznam, že by byla chyba na straně Ministerstva financí a mám pouze u jednoho klienta jeden jediný záznam, že se stejný doklad třikrát neodeslal z důvodu, že zrovna ten klient měl nefunkční internet. Na počtvrté už se to odeslalo s příznakem první zaslání na False, jak vyžaduje zákon. Což mi přijde neskutečně ideální a nechce se mi tomu věřit. Takže v březnu přeci jenom čekám, že už budou servery MF ČR padat. Údajně už problémy měly, ale já jsem je prostě v logách zatím nezaznamenal a všechno mělo FIK tak, jak má být. Takže se to asi neodesílalo v ten čas, kdy měl být na serveru MF ČR problém. Fakt se mi tomu nechce věřit, že by tentokrát státní správa opravdu realizovala téměř dokonalý systém ? Já se snad ožeru  :)

Offline Roman Č.

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: Delphi 7, XE2, 10.2 Tokyo
Re:Delphi + EET
« Odpověď #324 kdy: 12-01-2017, 16:24:33 »
To Marek Weyda:
Citace
Já se snad ožeru
Jakmile to rozchodím pod D7 + WinInet, přidám se :)

To Peťo:
Citace
Bolo nutné zmeniť viaceré deklarácie a vygoogliť nejaké v D7 neexistujúce funkcie.
No tady jsem právě skončil, konkrétně na neexistenci HTTPWebNode.GetHTTPReqResp.OnWinInetError (tedy neexistenci FOnWinInetError: TWinInetErrorEvent ve třídě THTTPReqResp) a hned na to na staré nekompatibilní definici TBeforeExecuteEvent = procedure(const MethodName: string; var SOAPRequest: InvString) of object v RIO.pas. To už bylo nad mé síly.
Pokud někdo máte upravené řešení, případně víte, jak dostat do D7 nové definice těchto objektů, budu velmi vděčný za jakoukoliv radu či ukázku kódu.

Offline Sender

  • Plnoletý
  • ***
  • Příspěvků: 184
  • Karma: 5
    • Verze Delphi: Delphi 7 Prof.
Re:Delphi + EET
« Odpověď #325 kdy: 12-01-2017, 17:00:16 »
Nejednodušším řešením asi je udělat z projektu na githubu dll knihovnu.V projektu D7 používat dll a posílat do ní data.

Offline Peťo

  • Nováček
  • *
  • Příspěvků: 36
  • Karma: 3
    • Verze Delphi: 7, 5, 4
Re:Delphi + EET
« Odpověď #326 kdy: 12-01-2017, 20:17:46 »
Nejednodušším řešením asi je udělat z projektu na githubu dll knihovnu.V projektu D7 používat dll a posílat do ní data.
To som aj urobil, akurát som to robil v Delphi 7, takže som všetky problémy starej verzie musel vyriešiť. Dôvodom bolo to, že projekt DelphiEET vyžaduje enormné množstvo DLL knižníc, čo je neprehľadné a naviac boli dve z nich v konflikte s ich inou verziou, ktorú už používam. V Dll som použil InterfacedObject, aby som vyexportoval celú triedu, a neviem, či by to fungovalo medzi rôznymi verziami Delphi.

V najnovšej verzii som videl, že Mirus tiež vytvoril v projekte dll knižnicu. Idem si zajtra ešte preštudovať, ako to urobil sám majster.

Offline mirus

  • Mladík
  • **
  • Příspěvků: 67
  • Karma: 12
    • Verze Delphi: Delphi 10.2
Re:Delphi + EET
« Odpověď #327 kdy: 13-01-2017, 09:58:23 »
Aktualizoval jsem nyní Delphi EET přidal jsem funkci TEETTrzba.OdeslaniTrzbyDirectIndy. Mělo by to být použitelné i pro Delphi Starter Edition. Není potřeba rekompilovat SOAP s podporou INDY t.j. není potřeba definovat USE_INDY. To sloužilo pouze pro rekompilaci SOAP delphi jednotek.
V této funkci je celý proces generování, odeslání a zpracování odpovědi pohromadě. Lze si libovolně nahrazením řádku FIdHttpClient.Post vložit svůj alternativní způsob odeslání (např. synapse, libcurl atd.).
Ostatní funkcionalita zachována.

Offline Peťo

  • Nováček
  • *
  • Příspěvků: 36
  • Karma: 3
    • Verze Delphi: 7, 5, 4
Re:Delphi + EET
« Odpověď #328 kdy: 13-01-2017, 11:32:11 »
Aktualizoval jsem nyní Delphi EET přidal jsem funkci TEETTrzba.OdeslaniTrzbyDirectIndy. Mělo by to být použitelné i pro Delphi Starter Edition. Není potřeba rekompilovat SOAP s podporou INDY t.j. není potřeba definovat USE_INDY. To sloužilo pouze pro rekompilaci SOAP delphi jednotek.
...
Ostatní funkcionalita zachována.

Obávam sa, že táto zmena znemožní kompiláciu pre tých, čo majú staršiu verziu Indy, kde nie je definované napr. sslvTLSv1_2, atď.

Bolo by možné funkciu OdeslaniTrzbyDirectIndy a všetko s tým súvisiace (uses Id...) dať tiež pod nejaký $define, napríklad USE_DIRECTINDY?

Vďaka.

Offline Roman Č.

  • Nováček
  • *
  • Příspěvků: 9
  • Karma: 0
    • Verze Delphi: Delphi 7, XE2, 10.2 Tokyo
Re:Delphi + EET
« Odpověď #329 kdy: 13-01-2017, 14:21:14 »
A přátelé pozor!! Povedlo se mi upravit kód od Miruse pro Delphi 7 a libeet, před chvílí jsem odeslal první účtenku! Tímto bych chtěl opět vyseknout poklonu Mirusovi, ale samozřejmě i všem dalším, kteří přispěli do tohoto fóra svými cennými podněty. Všem Vám patří veliký dík! A máme tady páťulínek, tak to asi oslavíme, co říkáte??!!

Ale abych také přispěl svou troškou: jak jsem psal tady dříve, zasekl jsem se především na staré verzi Rio.pas. Úprava nakonec nebyla až tak složitá, jen jsem dle naťuknutí od ostatních zkopíroval část kódu z posledních Soap.Rio zdrojů pro vyšší delphi.
Konkrétně jsem upravil deklaraci TBeforeExecuteEvent:
Kód: Delphi [Vybrat]
  1. TBeforeExecuteEvent = procedure(const MethodName: string; SOAPRequest: TStream) of object;
a původní strašný kód procedury TRIO.DoBeforeExecute jsem nahradil jen krátkým:
Kód: Delphi [Vybrat]
  1. TRIO.DoBeforeExecute(const MethodName: string; Request: TStream);
  2. begin
  3.   if Assigned(FOnBeforeExecute) then
  4.   begin
  5.     FOnBeforeExecute(MethodName, Request);
  6.     Request.Position := 0;
  7.   end;
  8. end;
  9.  

A jelikož opravdu netuším, kde všude se mohou změnit projevit, radši jsem Rio.pas nahradil jen ve svém projektu, do instalovaných knihoven  D7 jsem se rozhodl nezasahovat vůbec. V případě dalších dotazů rád pomohu, pokud budu vědět, všem tady to dlužím.