Informatie over XML-handtekeningen

Adobe AIR 1.5 of hoger

Een XML-handtekening is een digitale handtekening in de XML-syntaxis. De gegevens in een XML-handtekening kunnen worden gebruikt om te valideren dat de ondertekende informatie sinds de ondertekening niet is gewijzigd. Verder geldt dat wanneer een ondertekenend certificaat is uitgegeven door een vertrouwde certificeringsinstantie, de identiteit van de ondertekenaar kan worden geverifieerd via de infrastructuur voor openbare sleutels.

Een XML-handtekening kan worden toegepast op elk soort digitale gegevens (in binaire of XML-indeling). XML-handtekeningen worden in het algemeen gebruikt voor doeleinden als de volgende:

  • controleren of externe dan wel gedownloade bronnen zijn gewijzigd

  • verifiëren of berichten afkomstig zijn van een bekende bron

  • valideren van licenties voor toepassingen of machtigingen in verband met abonnementen

Ondersteunde syntaxis voor XML-handtekeningen

AIR ondersteunt de volgende elementen uit de W3C-aanbevelingen voor de syntaxis en verwerking van XML-handtekeningen:

  • Alle elementaire syntaxiselementen voor handtekeningen (sectie 4 van de W3C-aanbevelingen); alleen het KeyInfo-element wordt niet volledig ondersteund

  • Het KeyInfo-element mag alleen een X509Data-element bevatten

  • Een X509Data-element mag alleen een X509Certificate-element bevatten

  • De SHA256-samenvattingsmethode

  • Het RSA-SHA1 (PKCS1)-ondertekeningsalgoritme

  • De "Canonical XML zonder commentaar" methode Canonicalization en algoritme Transform

  • De "enveloped signature transform"

  • tijdstempels

Het volgende document illustreert een typische XML-handtekening (de meeste cryptografische gegevens zijn verwijderd om het voorbeeld te vereenvoudigen):

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="URI_to_signed_data"> 
            <Transforms> 
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>            </Transforms> 
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
            <DigestValue>uoo...vY=</DigestValue> 
        </Reference> 
    </SignedInfo> 
    <SignatureValue>Ked...w==</SignatureValue> 
    <KeyInfo> 
        <X509Data> 
            <X509Certificate>i7d...w==</X509Certificate> 
        </X509Data> 
    </KeyInfo> 
</Signature>

De belangrijkste elementen van een handtekening zijn:

  • SignedInfo — Bevat verwijzingen naar de ondertekende gegevens en de berekende samenvattingswaarden op het moment van ondertekening. De ondertekende gegevens kunnen zelf worden opgenomen in hetzelfde document als de XML-handtekening, of ze kunnen extern zijn.

  • SignatureValue — Bevat een samenvatting van het SignedInfo-element, gecodeerd met de persoonlijke sleutel van de ondertekenaar.

  • KeyInfo — Bevat het ondertekenende certificaat, evenals aanvullende certificaten die nodig zijn om de vertrouwensketen tot stand te brengen. Hoewel het KeyInfo-element technisch gesproken optioneel is, kan AIR de handtekening niet valideren als het niet is opgenomen.

Er zijn drie algemene typen XML-handtekeningen:

  • Enveloped — de handtekening wordt ingevoegd in de XML-gegevens die worden ondertekend.

  • Enveloping — de ondertekende XML-gegevens bevinden zich in een Object-element binnen het Signature-element.

  • Detached — de ondertekende gegevens zijn extern ten opzichte van de XML-handtekening. De ondertekende gegevens kunnen zich bijvoorbeeld in een extern bestand bevinden. Ze kunnen zich ook in hetzelfde XML-document als de handtekening bevinden, maar niet als bovenliggend of onderliggend element van het Signature-element.

XML-handtekeningen maken gebruik van URI's om te verwijzen naar de ondertekende gegevens. De ondertekenende en validerende toepassingen moeten gebruikmaken van dezelfde conventies voor het oplossen van deze URI's. Wanneer u de klasse XMLSignatureValidator gebruikt, moet u een implementatie van de IURIDereferencer-interface verstrekken. Deze implementatie moet ervoor zorgen dat de URI wordt opgelost en de ondertekende gegevens als ByteArray-object worden geretourneerd. Het geretourneerde ByteArray-object wordt samengevat met behulp van hetzelfde algoritme dat de samenvatting in de handtekening heeft geproduceerd.

Certificaten en vertrouwen

Een certificaat bestaat uit een openbare sleutel, informatie die het certificaat identificeert en mogelijk een of meer certificaten die horen bij de uitgevende certificeringsinstantie.

Vertrouwen in een certificaat kan op twee manieren worden bepaald. U kunt vertrouwen tot stand brengen door een kopie van het certificaat op te vragen bij de ondertekenaar, bijvoorbeeld op fysieke media, of via een veilige digitale transmissie, bijvoorbeeld een SSL-transactie. U kunt ook afgaan op een certificeringsinstantie om te bepalen of het ondertekenende certificaat betrouwbaar is.

Als u wilt afgaan op een certificeringsinstantie, moet het ondertekenende certificaat worden uitgegeven door een instantie die wordt vertrouwd op de computer waarop de handtekening wordt gevalideerd. De meeste fabrikanten van besturingssystemen plaatsen de basiscertificaten van een aantal certificeringsinstanties in het vertrouwensarchief van het besturingssysteem. Gebruikers kunnen ook certificaten toevoegen aan en verwijderen uit deze opslag.

Zelfs als een certificaat is uitgegeven door een vertrouwde certificeringsinstantie, moet u nog beslissen of het certificaat hoort bij iemand die u vertrouwt. Vaak wordt deze beslissing doorgegeven naar de eindgebruiker. Wanneer bijvoorbeeld een AIR-toepassing wordt geïnstalleerd, geeft het AIR-installatieprogramma de identificerende informatie van het certificaat van de uitgever weer als de gebruiker wordt gevraagd of deze de toepassing wil installeren. In andere gevallen moet u mogelijk de openbare sleutel of andere certificaatinformatie vergelijken met een lijst met acceptabele sleutels. (Deze lijst moet worden beveiligd, mogelijk door middel van een eigen handtekening of door de lijst op te slaan in de door AIR gecodeerde lokale opslag, zodat er niet met de lijst kan worden geknoeid.)

Opmerking: U kunt er weliswaar voor kiezen het ondertekenende certificaat te vertrouwen zonder onafhankelijke verificatie, bijvoorbeeld wanneer een handtekening zelf-ondertekend is, maar zo 'n verificatie betekent niet veel wat betreft betrouwbaarheid. Als u niet weet wie een handtekening heeft gemaakt, is de overtuiging dat er niet met de handtekening is geknoeid van weinig of geen waarde. De handtekening kan een correct ondertekende vervalsing zijn.

Verlopen en intrekking van certificaten

Alle certificaten verlopen uiteindelijk. Certificaten kunnen ook worden ingetrokken door de uitgevende certificeringsinstantie, bijvoorbeeld als de persoonlijke sleutel voor het certificaat door een kwaadwillende wordt gewijzigd of gestolen. Als een handtekening is ondertekend met een verlopen of ingetrokken certificaat, wordt de handtekening gerapporteerd als ongeldig, behalve als een tijdstempel is opgenomen als onderdeel van de handtekening. Als er een tijdstempel aanwezig is, valideert de klasse XMLSignatureValidator de handtekening mits het certificaat geldig was op het ogenblik dat het werd ondertekend.

Een tijdstempel is een getekend digitaal bericht van een tijdstempelservice dat bevestigt dat de gegevens op een bepaald tijdstip en een bepaalde datum zijn ondertekend. Tijdstempels worden uitgegeven door tijdstempelinstanties en worden ondertekend door het eigen certificaat van de tijdstempelinstantie. Het tijdstempel kan alleen worden vertrouwd wanneer het certificaat van de tijdstempelinstantie dat is ingesloten in de tijdstempel, wordt vertrouwd op de huidige computer. De XMLSignatureValidator biedt geen API waarmee een ander certificaat kan worden aangewezen voor het valideren van de tijdstempel.