XML Signatures Autor Martin Lasoň Abstrakt Digitální podpisy zajišťují integritu, autenticitu a nepopiratelnost dat na Webu. Takové rysy jsou zvlášť důležité pro dokumenty, které reprezentují závazky jako smlouvy, ceníky a prohlášení. Tato práce pojednává o digitálních podpisech dokumentů (dostupných pomocí URI na Webu) s použitím XML syntaxe. Využití těchto vlastností je zvláště důležité pro komerční elektronické aplikace. Klíčová slova XML, digitální podpis, počítačová bezpečnost. Seznam použitých symbolů a zkratek HTML HyperText Markup Language je jazyk pro tvorbu hypertextových dokumentů pro Web. MAC Message Authenticity Code klíčovaná jednocestná hašovací funkce generující charakteristiku závislou na hodnotě nějakého tajemství klíče. SSL Secure Sockets Layer je protokol vyvinutý společností Netscape Communications pro vybudování bezpečného spojení přes internetový kanál. Zaručuje autenticitu partnerů komunikace, důvěrnost, integritu a autenticitu přenášených údajů. URI Uniform Resource Identifier je řetězec znaků určený k identifikaci abstraktního nebo fyzického zařízení. X.509 Standardizovaný formát pro certifikáty a revokační seznamy. XML Extensible Markup Language je množina pravidel pro definici sémantických značek, které rozdělují dokument na části a identifikují různé části dokumentu. 1
Obsah 1 Úvod 3 2 XML digitální podpis 3 2.1 Hlavní cíle.................................... 3 2.2 Výhody..................................... 3 2.3 Nevýhody.................................... 4 2.4 Syntaxe..................................... 4 2.5 Typ podepisovaných dat............................ 5 2.6 Algoritmy.................................... 8 3 Práce s podpisem 8 3.1 Vytvoření XML podpisu............................ 8 3.2 Ověření XML podpisu............................. 11 4 XPath Filter 11 4.1 Rozdíly oproti XPath.............................. 12 4.2 Příklad transformace.............................. 12 5 Závěr 13 2
1 Úvod Současné bezpečnostní technologie nedostačují k zabezpečení obchodních transakcí na Webu. Většina současných bezpečnostních mechanismů založených na prohlížečích dostačuje pro menší obchodní transakce prodeje zákazníkům, ale neposkytuje zvýšenou bezpečnost k ochránění důležitých komerčních transakcí a k výměně citlivých informací s nimi spojenými. Nač ale potřebujeme XML podpisy, pokud při komunikaci se serverem využíváme SSL? Pokud se na celou věc podíváme z pozice hackera, tak co by pro něj bylo jednodušší: odchytávat IP pakety jednotlivého připojení, aby zaměnil jedno číslo kreditní karty, nebo nabourat se na server, kde jsou uložena všechna čísla kreditních karet? A zde přichází na řadu digitální podpis. 2 XML digitální podpis Stejně jako zajištění důvěrnosti obchodních zpráv, je důležité zabezpečit i jejich autenticitu (kdo je poslal), integritu (zda nebyly pozměněny) a umožnit nepopiratelnost (nemožnost popřít odeslání). Obecně uznávaná metoda k zajištění těchto požadavků v zabezpečených obchodních transakcích je využití digitálních certifikátů a digitálního podpisu. Díky vlastnostem XML, jako jsou bohatá sémantika, strukturovaná data, textový základ a Webová povaha může být tohoto formátu použito k šifrování a digitálnímu podpisu dat. 2.1 Hlavní cíle V případech, kdy dokument vytváří několik účastníků, každý chce podepsat jen tu část, za kterou je zodpovědný. Pro tyto účely je navržen XML podpis (anglicky XML Signature) XML podpis je vyvíjen společným úsilím World Wide Web Consortium (W3C) a Internet Engineering Task Force (IETF). Cílem této pracovní skupiny [1] je vyvinout syntaxi jazyka XML, umožňující reprezentaci podpisů Webových zdrojů a části protokolových zpráv (cokoli adresovatelného pomocí URI), a procedur pro výpočet a ověření takových podpisů. XML podpisy jsou digitální podpisy navržené pro použití v XML transakcích. Standard definuje schéma pro popsání výsledku operace digitálního podpisu provedené na libovolných (často XML) datech. Stejně jako digitální podpisy, které nejsou ve formátu XML (např. PKCS), přidávají XML podpisy autentizaci, integritu dat a nepopiratelnost k datům která podepisují. Na rozdíl od jiných standardů digitálního podpisu byl XML podpis navržen tak, aby podporoval oba typy a mohl být využit v Internetu a XML. XML podpisy usnadňují aplikacím podepisování zdrojů na Webu. 2.2 Výhody Hlavní výhodou XML podpisů je schopnost podepsat jen určitou část XML stromu místo celého dokumentu. To může být důležité v případě, kdy jeden XML dokument má dlouhou 3
historii a různé části vytvářely různé strany a každá podepisuje jen ty elementy, za které je zodpovědná. Tato flexibilita je zvláště výhodná v případě, kdy je důležité zajistit integritu jisté části dokumentu, který je ponechán otevřený pro případné změny. Příkladem může být XML formulář, kde by podpis přes celý formulář neumožňoval změnit položky aniž by došlo k zneplatnění podpisu. 2.3 Nevýhody XML podpis (podle RFC 3075) zaručuje integritu, autenticitu zprávy a/nebo služby autentizující podepsaného pro jakýkoli datový typ umístěný v podepsaném XML nebo kdekoli jinde. Hlavním cílem těchto podpisů je poskytovat základní serverové bezpečnostní služby pro Web pomocí XML. Jeho autoři však varují, aby tato práce nebyla považována za technický všelék. XML podpisy předpokládají použití Webu (pomocí URI v XML) k nalezení metod pro zakódování a dekódování. Jestliže ale podpis potřebuje zdroje ze sítě, aby mohl provést akci, kdo bude dodávat tyto zdroje? Proces XML podpisu je navržen co nejobecněji, ale právě tato obecnost je problém. Představme si například komerční softwarovou společnost, která se rozhodne, že chce poskytovat tyto autentizační služby. Dále předpokládejme, že operační systém této společnosti je široce rozšířen. Společnost přijde s novou verzí operačního systému, který obsahuje klienta využívajícího jen XML podpisy k zajištění bezpečnosti. Všechny XML kódy ukazují na servery tohoto výrobce. Autentizace pomocí tohoto klienta se stane široce používaná, protože je snadné jej nastavit jako výchozí v rozšířeném operačním systému. A tak jej výrobce zakotví do jeho oblíbeného zdarma dodávaného prohlížeče jako výchozí bezpečnostní mechanismus. A jako třešničku na dortu začne tento výrobce zpoplatňovat každé využití jeho serverů k autentizaci tímto klientem. A najednou jsou příjmy a monopol na světě! 2.4 Syntaxe XML digitální podpisy jsou reprezentovány elementem <Signature>, který má následující strukturu 1 : <Signature> <SignedInfo> <CanonicalizationMethod/> <SignatureMethod/> (<Reference (URI=)? > (<Transforms/>)? <DigestMethod/> <DigestValue/> </Reference>)+ 1 znak? znamená žádný nebo jeden výskyt, + znamená jeden nebo více výskytů a * znamená nula nebo více výskytů 4
</SignedInfo> <SignatureValue/> (<KeyInfo/>)? (<Object ID?/>)* </Signature> Povinný element <SignedInfo> je informace, která je opravdu podepisována. Ověření podpisu (anglicky validation) se skládá ze dvou povinných částí ověření podpisu a ověření každého zdroje popsaných podrobněji v části 3.2. Algoritmus uvedený v <CanonicalizationMethod> je použit pro standardizaci elementu <SignedInfo> před tím, než je vytvořen otisk (anglicky digest). Různé datové proudy se stejnými XML informacemi, které se liší například jen mezerami, je totiž potřeba převést do jednotného tvaru, aby se předešlo problémům při ověřování. Proces vytváření podpisu je podrobněji vysvětlen na příkladě v části 3.1. <SignatureMethod> označuje algoritmus použitý pro převedení normalizovaného elementu <SignedInfo> na hodnotu <SignatureValue>. Jedná se o kombinaci algoritmu otisku, algoritmu závislého na klíči a případných jiných algoritmech, jako je vycpávání (anglicky padding). Každý element <Reference> obsahuje typ otisku a jeho výslednou vypočtenou hodnotu. Volitelné URI identifikuje podepisovaný datový objekt. Element <Transforms> pak obsahuje volitelný seznam kroků, které byly provedeny se zdrojem než byl podepsán. Může se jednat o operace jako XSLT, XPath, komprese atd. <KeyInfo> označuje klíč určený k ověření podpisu. Tento element je volitelný jednak z důvodu, že podepsaný si nemusí přát prozradit svůj klíč všem stranám, které s dokumentem pracují a nebo je tato informace aplikaci již známa a není potřeba ji proto všude uvádět. (Tento element se využívá také v XML Encryption.) Volitelný element <Object> slouží ke vkládání datových objektů v rámci elementu podpisu nebo jinam. 2.5 Typ podepisovaných dat XML podpis může podepsat jeden nebo více zdrojů různého typu. Například jeden XML podpis může zahrnovat textová data (HTML), binární data (JPG), XML data a stanovenou část XML souboru. Ověření vyžaduje, aby byl podepsaný objekt dostupný. XML podpis obvykle označuje místo podepsaného objektu. Odkaz na takovýto objekt může být adresován pomocí URI v XML podpisu (obr. 1) být umístěn ve stejném zdroji jako XML podpis podpis je sourozenec (obr. 2) být zakotvený v XML podpisu podpis je rodič (obr. 3) mít svůj XML podpis zakotven v sobě podpis je syn (obr. 4) 5
Obrázek 1: Odkaz na podepisovaný objekt pomocí URI Obrázek 2: Odkaz umístěný ve stejném zdroji jako XML podpis 6
Obrázek 3: Odkaz zakotvený v XML podpisu Obrázek 4: Podpis zakotvený v odkazu 7
Typ Algoritmus Požadavky Otisk (Digest) SHA1 Vyžadováno Kódování base64 Vyžadováno MAC HMAC-SHA1 Vyžadováno Podpis DSAwithSHA1 (DSS) Vyžadováno Podpis RSAwithSHA1 Doporučeno Standardizace Canonical XML Vyžadováno Standardizace Canonical XML with Comments Doporučeno Transformace XSLT Dobrovolné Transformace XPath Doporučeno Transformace Enveloped Signature Vyžadováno Tabulka 1: Algoritmy využívané v XML podpisu. Algoritmus SHA1 Base64 HMAC-SHA1 DSAwithSHA1 (DSS) RSAwithSHA1 Canonical XML XSLT XPath URI algoritmu http://www.w3.org/2000/09/xmldsig#sha1 http://www.w3.org/2000/09/xmldsig#base64 http://www.w3.org/2000/09/xmldsig#hmac-sha1 http://www.w3.org/2000/09/xmldsig#dsa http://www.w3.org/2000/09/xmldsig#rsa-sha1 http://www.w3.org/tr/2001/rec-xml-c14n-20010315 http://www.w3.org/tr/1999/rec-xslt-19991116 http://www.w3.org/tr/1999/rec-xpath-19991116 Tabulka 2: URI algoritmů používaných v podpisu. 2.6 Algoritmy Tabulka 1 uvádí algoritmy využívané v XML digitálním podpisu. Jednotlivé algoritmy jsou identifikovány pomocí URI, které je uvedeno jako atribut elementu označujícího způsob jeho použití. Tato URI jsou uvedena v tabulce 2. 3 Práce s podpisem 3.1 Vytvoření XML podpisu Následující kroky vysvětlují postup vytvoření XML podpisu. Uvedený příklad je převzat z [5]. 1. Určení zdrojů, které budou podepsány. V tomto kroku se vytvoří identifikace zdrojů pomocí URI. 8
"http://www.abccompany.com/index.html" je odkaz na HTML stránku na Webu. "http://www.abccompany.com/logo.gif" je odkaz na obrázek GIF na Webu. "http://www.abccompany.com/xml/po.xml" je odkaz na XML soubor na Webu. "http://www.abccompany.com/xml/po.xml#sender1" je odkaz na určitý element XML souboru na Webu. 2. Vypočtení otisku každého zdroje. V XML podpisu je každý odkazovatelný zdroj popsán elementem <Reference> a jeho otisk je umístěn v synovském elementu <DigestValue>, jak je uvedeno na příkladě: <Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue> </Reference> <Reference URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/ signature-example.xml"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue> </Reference> Element <DigestMethod> určuje algoritmus, který byl použit pro výpočet otisku. 3. Shromáždění elementů Reference Elementy <Reference> jsou se svými otisky shromážděny do elementu <Signed- Info>. <SignedInfo Id="foobar"> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" /> <Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue> </Reference> <Reference URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/ signature-example.xml"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 9
<DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue> </Reference> </SignedInfo> Element <CanonicalizationMethod> označuje algoritmus, který byl použit ke standardizaci elementu <SignedInfo>. Element <SignatureMethod> označuje algoritmus použitý k vytvoření hodnoty podpisu. 4. Podepsání Je vypočten otisk elementu <SignedInfo>, provedeno podepsání tohoto otisku a umístění hodnoty podpisu do elementu <SignatureValue>. <SignatureValue>MC0E\~LE=</SignatureValue> 5. Přidání informace o klíči Jestliže je vkládána informace o klíči, pak je to do elementu <KeyInfo>. Tyto informace pak obsahují X.509 certifikát odesilatele, který může obsahovat veřejný klíč potřebný k ověření podpisu. <KeyInfo> <X509Data> <X509SubjectName> CN=Ed Simon,O=XMLSec Inc.,ST=OTTAWA,C=CA </X509SubjectName> <X509Certificate>MIID5jCCA0+gA...lVN</X509Certificate> </X509Data> </KeyInfo> 6. Zapouzdření do elementu Signature Umístění elementů <SignedInfo>, <SignatureValue> a <KeyInfo> do elementu <Signature>. Element <Signature> pak obsahuje XML podpis. <?xml version="1.0" encoding="utf-8"?> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo Id="foobar"> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/> <Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm"> 10
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue> </Reference> <Reference URI="http://www.w3.org/TR/2000/ WD-xmldsig-core-20000228/signature-example.xml"> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue> </Reference> </SignedInfo> <SignatureValue>MC0E\~LE=</SignatureValue> <KeyInfo> <X509Data> <X509SubjectName> CN=Ed Simon,O=XMLSec Inc.,ST=OTTAWA,C=CA </X509SubjectName> <X509Certificate> MIID5jCCA0+gA...lVN </X509Certificate> </X509Data> </KeyInfo> </Signature> 3.2 Ověření XML podpisu K ověření XML podpisu je potřeba provést následující dva kroky: 1. Provede se ověření podpisu elementu <SignedInfo>. K tomu je potřeba přepočítat otisk elementu <SignedInfo> (algoritmem uvedeným v elementu <SignatureMethod> a pomocí veřejného klíče ověřit, že hodnota elementu <SignatureValue> souhlasí s otiskem v elementu <SignedInfo>. 2. Pokud je předchozí krok úspěšný, jsou přepočítány otisky odkazů uvedených v elementu <SignedInfo> a porovnány s hodnotami otisků uvedenými v elementech <DigestValue> odpovídajícího elementu <Reference>. 4 XPath Filter Doporučení týkající se XML podpisu [2] definuje standard pro specifikaci obsahu digitálně podepisovaných informací, včetně možnosti podepsat část XML dokumentu. Specifikace XML podpisu splňuje tento požadavek pomocí transformace XPath. Ovšem efektivně implementovat tuto transformaci současnými technologiemi může být poněkud obtížné. 11
Specifikace XML Signature XPath Filter 2.0 [6] popisuje novou transformaci podpisového filtru, která poskytuje metodu pro spočítání podpisu části dokumentu stejně jako transformace XPath. V zájmu zjednodušení vytváření účinných implementací se architektura této transformace nezakládá na vyhodnocení výrazu XPath pro každý uzel XML stromu, jak je to definováno datovým modelem XPath. Místo toho je sekvence výrazů XPath použita k vybrání kořenů podstromů dokumentu (v jazyce XPointer množiny lokací), které jsou sloučeny pomocí množinového průniku, odčítání a spojení a poté použity k filtrování vstupní množiny uzlů. 4.1 Rozdíly oproti XPath Cílem XPath Filter 2.0 je snadněji specifikovat transformace XPath a efektivněji tyto transformace provádět. Hlavní odlišnosti od transformace XPath jsou: Sekvence XPath operací může být provedena v jediné transformaci. Navíc umožňuje, aby bylo možné snadněji vyjádřit a optimalizovat komplexní filtry. Výrazy XPath jsou vyhodnocovány na vstupním dokumentu chápaném jako množina uzlů, namísto logického testování každého uzlu z množiny vstupních uzlů. Pro zvýšení efektivity je expanze daného uzlu, za účelem vložení všech uzlů, které tento uzel mají jako předka, je nyní implicitní a tak může být provedena rychleji než vyhodnocení výrazu XPath pro každý uzel dokumentu. Výsledná množina uzlů může být zkombinována pomocí třech základních množinových operací (průniku, rozdílu a spojení) a použita jako filtr na množinu vstupních uzlů. Na těch je pak možno provést operace, jako podepsání celého dokumentu, kromě přesně stanovené podmnožiny. Vše je tak vyjádřeno jasněji a efektivněji. Stejně jako u původní transformace XPath, je hlavním cílem této transformace zajistit, že na vstupním XML dokumentu jsou po připojení podpisu povoleny jen přesně definované změny. 4.2 Příklad transformace Následující příklad znázorňuje jednu možnost vytvoření podpisu pomocí transformace podpisovým filtrem. Funkce here() identifikuje element XPath a následné umístění obdrží nejbližší předek elementu Signature. Protože je hodnota atributu Filter nastavena na subtract, výstupem transformace podpisového filtru je množina uzlů obsahující každý uzel ze vstupní množiny, kromě uzlů podstromu, jehož kořenem je element Signature <XPath Filter="subtract" xmlns="http://www.w3.org/2002/06/xmldsig-filter2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> here()/ancestor::dsig:signature[1] </XPath> 12
Při použití tohoto rozdílového filtru by mohlo být vhodným URI odkazem na podpis URI="" (pro celý podpisový dokument bez komentářů), URI="#xpointer(/)" (celý podpisový dokument s komentáři) nebo nějaký odkaz na stejný dokument, který sám obsahuje podpis. 5 Závěr Přestože je možným nevýhodám XML podpisu v tomto textu věnována větší část než výhodám, jeho přínos je nesporný. Jakmile se XML stane nezbytnou součástí infrastruktury elektronického obchodování bude potřeba důvěryhodných a bezpečných zpráv pro vytvoření základu obchodních transakcí. Jednou z možností pro vytvoření bezpečných transakcí je použití digitálního podpisu zaručujícího integritu a autenticitu zdroje obchodních dokumentů. XML podpis je vyvíjející se standard digitálního podpisu, který využívá XML syntaxi pro popis výsledků, což zjednodušuje jeho integraci do XML aplikací. Reference [1] The World Wide Web Consortium: XML Signature Working Group http://www.w3.org/signature/, [8.11.2002] [2] The World Wide Web Consortium: XML-Signature Syntax and Processing http://www.w3.org/tr/xmldsig-core/, [12.2.2002] [3] The Internet Engineering Task Force: XML Digital Signatures http://www.ietf.org/html.charters/xmldsig-charter.html, [27.8.2002] [4] Loeb, L.: XML signatures: Behind the curtain http://www-106.ibm.com/developerworks/security/library/s-digsig.html, [1.12.2001] [5] O Reilly & Associates, Inc.: An Introduction to XML Digital Signatures http://www.xml.com/pub/a/2001/08/08/xmldsig.html, [8.8.2001] [6] The World Wide Web Consortium: XML-Signature XPath Filter 2.0 http://www.w3.org/tr/xmldsig-filter2/, [8.11.2002] 13