Postup tvorby HASHe
Pro implementaci zabezpečení (autorizace) služeb ze skupiny „PF“ je možné použít zjednodušenou autentizaci prostřednictvím přihlašovacích údajů do Portálu farmáře (konkrétně uživatelského jména a přístupového WS klíče, který je určen pro volání webových služeb). Formát autentizačního elementu je uveden zde. Tento element se vkládá do hlavičky SOAP obálky (SOAP:Header) – viz zde.
Jak vytvořit identifikační řetězec
Hodnota, která se vkládá do tohoto elementu, se vytváří pomocí následujících funkcí:
- hashovací funkce SHA1
- hashovací funkce SHA512
- kanonizační transformace
XmlDsigC14NTransform(Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#")
Pokud nebudete využívat komunikační modul vOKOsCom nebo vOKOsComSender, který je pro tyto potřeby k dispozici, ale chcete implementovat tuto funkci vlastními silami, budete pro implementaci výše uvedených funkcí potřebovat alespoň povrchní znalosti práce s xml a SOAP.
Simulátor výpočtu HASH s libovolnými vstupními údaji + ověření requestu na XSD služby
Pro výpočet jednotlivých kroků s využití reálných údajů (request a libovolný text jako WS klíč /pravý nebo fiktivní/) připravilo MZe interaktivní aplikaci. Tato aplikace vypočítá hodnoty v rámci jednotlivých kroků a tím umožní vývojáři odladit funkčnost své komponenty proti výsledkům jednotlivých kroků.
Aplikace také na základě identifikace služby v requestu provede ověření request na XSD konkrétní služby a případně vypíše chyby, pokud není request validní na XSD služby.
Postup výpočtu je následující:
Z WS klíče pro volání webových služeb EPO vytvoříme SHA1 hashovací funkcí hash WS klíče (dále jen SHA1PWD - binárně) a mějme jej uložen v poli bytů (byte[]).
Z datové zprávy, kterou hodláme zabezpečit (a kterou máme již v SOAP obálce) vezmeme pouze SOAP:Body element a provedeme nad ním kanonizační transformaci, získáme tedy kanonizované SOAP:Body (dále jen CanonisedBody).
K CanonisedBody přičteme SHA1PWD (pozor ten je v binární podobě) (provedeme konkatenaci CanonisedBody a SHA1PWD) a provedeme výpočet SHA512 hashovací funkce nad tímto řetezcem.
Ukázka vstupu pro výpočet SHA512:
Výsledné pole bytů (z SHA512 fce) převedeme na base64, takto získáme zabezpečovací token, dále MessageToken
Vytvoříme novou SOAP:Header hlavičku (<vOKO-wss:Token xmlns:vOKO-wss="http://www.pds.eu/vOKO/v0200/wss"/>) která dále bude obsahovat atribut type s konstantní hodnotou „A01“, obsahem této hlavičky pak bude MessageToken.
Celá hlavička pak bude vypadat např. takto:
<vOKO-wss:Token type="A01" xmlns:vOKO-wss="http://www.pds.eu/vOKO/v0200/wss">UDu9cWkK9xryGvSJl7HhT6JgrmKcSfkYv3DPZc75GZpDbVU2RDR9envDjiR7fwPBxDEqFo/sUqI9fk6U3+GZmg==</vOKO-wss:Token>
Dále ve vlastní zprávě je u takto zabezpečených služeb povinnost vyplnění atributu „dn“ elementu UIDkey – tento atribut se plní přihlašovacím jménem k portálu farmáře (například 99lojza001).
Dále pro kontrolu přikládám příklad zprávy a výstupů hashovacích funkcí:
Kontrolní zpráva:
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Header /> <SOAP:Body> <XML> <pokus/> <pokus logo="as asa" ></pokus> </XML> </SOAP:Body> </SOAP:Envelope>
Kanonizovaná zpráva:
<SOAP:Body xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"><XML><pokus></pokus><pokus logo="as asa"></pokus></XML></SOAP:Body>
Zpráva kompletní (vstup pro SHA1PWD je „WS klíč“):
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"><SOAP:Header><vOKO-wss:Token type="A01" xmlns:vOKO-wss="http://www.pds.eu/vOKO/v0200/wss">UDu9cWkK9xryGvSJl7HhT6JgrmKcSfkYv3DPZc75GZpDbVU2RDR9envDjiR7fwPBxDEqFo/sUqI9fk6U3+GZmg==</vOKO-wss:Token></SOAP:Header><SOAP:Body><XML><pokus /><pokus logo="as asa"></pokus></XML></SOAP:Body></SOAP:Envelope>
SHA1 řetězce „heslo“ (v base64):
bgF7VGT4IKbBu16fbXEaZnqA2Oo=
SHA512 celé zprávy(MessageToken v base64):
UDu9cWkK9xryGvSJl7HhT6JgrmKcSfkYv3DPZc75GZpDbVU2RDR9envDjiR7fwPBxDEqFo/sUqI9fk6U3+GZmg==