Zadejte hledaný výraz...

PHP SoapClient – Problém s podpisovaním obsahu

Zdravím všetkých Webtržníkov.
Chcel by som sa spýtať, či tu má niekto skúsenosti s komunikáciou s webovými službami prostrdníctvom PHP - SoapClient. Webová služba, s ktorou sa pokúšam komunikovať vyžaduje podpisovanie obsahu. Mám k dispozícii súbory *.crt a *.key, ktoré sú použité pri autorizácii VPN, aby bolo možné načítať WSDL súbory poskytovateľa služby.
Pre podpísanie požiadavky som skúšal použiť knižnicu ako https://github.com/goodguy/php-signed-soap-client tak aj https://github.com/robrichards/wse-php, no ani v jednom prípade som sa nedopracoval k odpovedi zo servera.
Zaujímalo by ma, či tu je niekto, kto má s týmto skúsenosti, s kým by bolo možné tento problém prekonzultovať. Vďaka
5. 4. 2015 13:11:50
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104040
Jan Smitka
verified
rating uzivatele
5. 4. 2015 14:46:31
Ahoj,
jestli jsem to pochopil správně, tak potřebuješ požadavky podepisovat pomocí WSS (WebService Security).
Řešil jsem to teď na jednom projektu. Vyšel jsem z https://github.com/Maks3w/xmldsig, která využívá https://github.com/robrichards/xmlseclibs. Druhá jmenovaná knihovna slouží k obecnému podepisování XML dokumentů, první nastiňuje princip integrace do SOAP klienta. Celé podepisování a generování SOAP hlaviček pomocí té knihovny xmlseclibs jsem si nakonec napsal sám, všechno je pěkně popsané ve specifikaci WSS.
Co ti ten server vrací? Odpoví vůbec?
Na začátek taky zkus certifikát nakonfigurovat třeba do SOAP UI a poslat podepsaný požadavek z něj. Některé služby také mohou vyžadovat generování timestamps a jeho podepsání - více informací by ti měl dát k dispozici vystavovatel té služby.
Honza
5. 4. 2015 14:46:31
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104039
Pokiaľ som nepodpísal požiadavku žiadnym z vyššie uvedených knižníc, tak mi server vracal nasledujúcu odpoveď:
Pri pokuse podpísať požiadavku pomocou https://github.com/robrichards/wse-php tak mi server vrátil
Pre podpis som vytvoril súbory s koncovkou *.pem pomocou konzoly a príkazov:
, ktoré som následne zadefinoval absolútnou cestou, ale k úspešnej odpovedi som sa nedopracoval.
Skúšal som aj program SoapUI, v tomto ale nie som zbehlý a teda mi veľmi nepomohol. Ako som písal, mám dva certifikáty *.crt a jeden súbor *.key, technická podpora služby mi len odpísala toľko, že je potrebné správu podpísať. S podpisom skúsenosti nemám a tak som na tomto probléme zastal. Bol by som vďačný ak by si mi vedel poskytnúť tvoju knižnicu pre podpisovanie a poprípade mi vysvetlil ako nato.
Stáva sa mi ináč, že pokiaľ spustím script na localhoste tak sa script vôbec ani nespustí, v konzole to hlási len "Caution: request is not finished yet!", nepomôže ani reštart localhostu. Je potrebné niekedy zavrieť celý prehliadač, resp. záložku a znova niekoľko krát reštartovať localhost.
5. 4. 2015 15:39:58
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104038
node
verified
rating uzivatele
(5 hodnocení)
5. 4. 2015 16:06:00
Soap som v zivote nepouzil ale
Bad ValueType ""
myslim jasne dava na javo ze asi neposielas data v spravnom formate/strukture kedze dostava prazdnu hodnotu.
5. 4. 2015 16:06:00
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104037
Jan Stejskal
verified
rating uzivatele
(7 hodnocení)
5. 4. 2015 19:57:53
Vytvoření certifikátu ve formátu .pem je správný krok. Pak je třeba, aby samotné PHP bylo se zapnutým SSL. Soap klietna je třeba vytvořit s použitím cesrtifikátu, tedy:
A důležité také je, že cesta k certifikátu by neměla být relativní.
5. 4. 2015 19:57:53
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104036
Tento postup som skušal ale nepodarilo sa mi od servera dostať odpoveď na požiadavku. Nie je mi celkom jasné, či *.pem súbor má obsahovať kľúče ako zo súboru *.key tak aj zo súboru *.crt. mimochodom od poskytovaľa služby mám dva súbory s koncovkou *.crt. Jeden s názvom ca a druhý s názvom client. Tak či tak som skúšal už rôzne kombinácie ale neúspešne.
Ako dobré riešenie sa mi javí riešenie, ktoré spomenul jansmitka. Potreboval by som s ním ale pomôcť.
5. 4. 2015 20:24:30
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104035
Jan Smitka
verified
rating uzivatele
5. 4. 2015 21:30:14
Napsal Jan Stejskal;1183738
Vytvoření certifikátu ve formátu .pem je správný krok. Pak je třeba, aby samotné PHP bylo se zapnutým SSL. Soap klietna je třeba vytvořit s použitím cesrtifikátu, tedy:
A důležité také je, že cesta k certifikátu by neměla být relativní.
Jedná se o WS-Security, což je podepisování samotných zasílaných dat. Volba local_cert slouží k nastavení certifikátu k ověřování klienta na úrovni SSL/TLS, což je něco jiného.
Napsal Crealab.sk;1183696
Pri pokuse podpísať požiadavku pomocou https://github.com/robrichards/wse-php tak mi server vrátil
Pre podpis som vytvoril súbory s koncovkou *.pem pomocou konzoly a príkazov:
, ktoré som následne zadefinoval absolútnou cestou, ale k úspešnej odpovedi som sa nedopracoval.
Napsal Crealab.sk;1183743
Tento postup som skušal ale nepodarilo sa mi od servera dostať odpoveď na požiadavku. Nie je mi celkom jasné, či *.pem súbor má obsahovať kľúče ako zo súboru *.key tak aj zo súboru *.crt. mimochodom od poskytovaľa služby mám dva súbory s koncovkou *.crt. Jeden s názvom ca a druhý s názvom client. Tak či tak som skúšal už rôzne kombinácie ale neúspešne.
Podle odpovědi a toho co píšeš se opravdu jedná o WS-Security.
K podpisu potřebuješ dva soubory: privátní klíč (*.key) a certifikát s veřejným klíčem (*.crt nebo *.cer), oba musí zůstat v oddělených souborech. Oba mimochodem většinou ve formátu PEM, takže by nemělo být potřeba je jakkoliv konvertovat. CA soubor slouží pouze k tomu, pokud by ses rozhodl ověřovat správnost podpisu odpovědi, případně aby tvůj lokální systém věřil samotnému certifikátu (k podpisu není potřeba).
Postup pro podpis je zhruba následující:
Vygeneruješ normální SOAP požadavek, což je XML, ten ale neposíláš. Z daného XML musíš podepsat element soapenv:Body (tj. vypočítáš hash z celého kanonizovaného elementu, ten vložíš spolu s informacemi o použitých algoritmech do informacích o podpisu (element ds:Signature) a z toho se vypočítá další hash - vloží se dvakrát, jednou normálně a podruhé zašifrovaný privátním klíčem - ten ti nikdy nesmí uniknout). K podpisu se také přiloží celý certifikát s veřejným klíčem - na základě něj si může druhá strana ověřit, že podpis nikdo neupravil. Z certifikátu si vytáhne veřejný klíč a může dešifrovat část hashe v podpisu. Certifikát navíc může být v několika různých formátech. Všechny informace o podpisu se vloží jako hlavička wsse:Security do elementu soapenv:Body.
Hodilo by se, kdybys uložil požadavek, který se na server posílá, abych se mohl podívat, co na něm vypadá špatně a co případně chybí.
Podepsaný požadavek má vypadat nějak takto:
Samotný certifikát je v elementu wsse:BinarySecurityToken, jeho atribut ValueType určuje formát. Certifikát *.crt je právě onen #X509v3. Z elementu KeyInfo se odkazuje na použitý certifikát. Element ds:SignedInfo obsahuje informace o elementech, které byly podepsány, použité algoritmy a samotné hodnoty hashů. ds:SignatureValue pak obsahuje podepsaný element ds:SignedInfo.
Podle chybové hlášky soudím, že knihovna nepřipojila všechny potřebné informace - buď úplně vynechala přiložení certifikátu, nebo nevyplnila ValueType. Nebo jsi mu dal něco, co není certifikát - třeba ten privátní klíč, ten se mu pak do zprávy ani nepodaří zahrnout.
Kód mého řešení poskytnout nemohu. Pokud bys potřeboval pomoci, tak se můžeme dohodnout na nějaké konzultaci - více info do zpráv.
5. 4. 2015 21:30:14
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104034
Vďaka jansmitka, sa mi podarilo odstrániť chybu Bad ValueType, momentálne sa ale vyskytla ďalšia chyba:
Fatal error: Uncaught SoapFault exception: The security token could not be authenticated or authorized.
Generovaný XML s požiadavkou pre webovú službu:
Vie niekto poradiť, kde by mohla byť chyba?
7. 4. 2015 12:09:46
https://webtrh.cz/diskuse/php-soapclient-problem-s-podpisovanim-obsahu#reply1104033
Pro odpověď se přihlašte.
Přihlásit