Om XML-signaturer

Adobe AIR 1.5 och senare

En XML-signatur är en digital signatur som representeras i XML-syntaxen. Informationen i en XML-signatur kan användas för att verifiera att den signerade informationen inte har modifierats sedan signeringen. När ett signeringscertifikat har utfärdats av en betrodd certifikatutfärdare kan signerarens identitet dessutom verifieras via infrastrukturen med offentliga nycklar.

En XML-signatur kan användas med alla typer av digitala data (i binärt format eller XML-format). XML-signaturer används exempelvis för att:

  • kontrollera om externa eller hämtade resurser har ändrats

  • verifiera att meddelanden kommer från en känd källa

  • validera programlicens- eller prenumerationsbehörigheter.

XML-signatursyntax som stöds

AIR stöder följande element från W3C:s rekommendation för XML-signatursyntax och -bearbetning:

  • Alla grundläggande signatursyntaxelement (avsnitt 4 i W3C:s rekommendationsdokument), förutom elementet KeyInfo som inte stöds fullt ut

  • Elementet KeyInfo får bara innehålla ett X509Data-element

  • Ett X509Data-element får bara innehålla ett X509Certificate-element

  • SHA256-sammanfattningsmetoden

  • RSA-SHA1-algoritmen (PKCS1) för signering

  • Transformeringsalgoritmen och kanoniseringsmetoden ”Kanonisk XML utan kommentarer”

  • Transformeringen av inbäddade (enveloped) signaturer

  • tidstämplar

Följande dokument illustrerar en typisk XML-signatur (större delen av den kryptografiska informationen har tagits bort för att förenkla exemplet):

<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>

Nyckelelementen i en signatur är:

  • SignedInfo – Innehåller referenser till den signerade informationen och de beräknade sammanfattningsvärdena vid tidpunkten för signeringen. Den signerade informationen kan vara extern eller finnas i samma dokument som XML-signaturen.

  • SignatureValue – Innehåller en sammanfattning av SignedInfo-elementet som krypterats med signerarens privata nyckel.

  • KeyInfo – Innehåller signeringscertifikatet och eventuella andra certifikat som behövs för att upprätta förtroendekedjan. Lägg märke till att även om KeyInfo-elementet tekniskt sett är valfritt kan AIR inte validera signaturen om den inte är inkluderad.

Det finns tre allmänna typer av XML-signaturer:

  • Enveloped – signaturen infogas i den XML-information som den signerar.

  • Enveloping – den signerade XML-informationen finns i ett Object-element i Signature-elementet.

  • Detached – den signerade informationen är extern och finns inte i samma dokument som XML-signaturen. Den signerade informationen kan finnas i en extern fil. Informationen kan också finnas i samma XML-dokument som signaturen, i stället för som ett överordnat eller underordnat element till Signature-elementet.

XML-signaturer använder URI:er för att referera till den signerade informationen. Signerings- och valideringsprogrammen måste använda samma konventioner för matchningen av dessa URI:er. När du använder XMLSignatureValidator-klassen måste du ange en implementering av IURIDereferencer-gränssnittet. Den här implementeringen ansvarar för att matcha URI:n och returnerar den signerade informationen som ett ByteArray-objekt. Det returnerade ByteArray-objektet sammanfattas med samma algoritm som användes för att generera sammanfattningen i signaturen.

Certifikat och förtroende

Ett certifikat består av en offentlig nyckel, ID-information och sannolikt ett eller flera certifikat som tillhör certifikatutfärdaren.

Du kan skapa förtroende i ett certifikat på två sätt. Du kan upprätta förtroende genom att erhålla en kopia av certifikatet från signeraren, t.ex. på ett fysiskt medium, eller via en säker digital överföring, t.ex. en SSL-överföring. Du kan också förlita dig på en certifikatutfärdare för att avgöra om signeringscertifikatet är tillförlitligt.

I det senare fallet måste signeringscertifikatet vara utfärdat av en utfärdare som är betrodd på den dator som signaturen valideras på. De flesta tillverkare av operativsystem placerar rotcertifikaten för ett antal certifikatutfärdare i operativsystemets förtroendearkiv. Användaren kan lägga till eller ta bort certifikat i arkivet.

Även om ett certifikat har utfärdats av en betrodd certifikatutfärdare måste du fortfarande bestämma om certifikatet tillhör någon som du litar på. I många fall fattas detta beslut av slutanvändaren. När ett AIR-program installeras visas exempelvis ID-informationen från utfärdarens certifikat när användaren ombeds att bekräfta att han eller hon vill installera programmet. I andra fall kan du behöva jämföra den offentliga nyckeln eller annan certifikatinformation med en lista med godkända nycklar. (Den här listan måste vara skyddad, t.ex. med sin egen signatur eller genom att den lagras på den krypterade lokala lagringsplatsen i AIR, så att det inte går att manipulera själva listan.)

Obs! Du kan välja att lita på signeringscertifikatet utan separat verifiering, t.ex. om en signatur är självsignerad, men verifieringen av signaturen ger i detta fall ingen garanti avseende säkerheten. Om du inte vet vem som skapade signaturen är det svårt, om inte omöjligt, att försäkra att signaturen inte har manipulerats. Signaturen kan vara en signerad förfalskning.

Återkallning och utgångsdatum för certifikat

Alla certifikat går ut. Certifikat kan också återkallas av certifikatutfärdaren, t.ex. om certifikatets privata nyckel har komprometterats eller blivit stulen. Om en signatur har signerats med ett certifikat som gått ut eller som har återkallats visas signaturen som ogiltig, såvida signaturen inte innehåller en tidsstämpel. Om signaturen innehåller en tidsstämpel valideras signaturen av XMLSignatureValidator-klassen, förutsatt att certifikatet var giltigt vid tidpunkten för signeringen.

En tidsstämpel är ett signerat digitalt meddelande från en tidsstämpeltjänst som certifierar att informationen signerades vid en viss tid ett visst datum. Tidsstämplar utfärdas av tidsstämpelutfärdare och signeras med tidsstämpelutfärdarens eget certifikat. Tidsstämpelutfärdarens certifikat som är inbäddat i tidsstämpeln måste betraktas som tillförlitligt på den aktuella datorn för att tidsstämpeln ska betraktas som giltig. XMLSignatureValidator tillhandahåller inget API för att ange ett annat certifikat som kan användas vid valideringen av tidsstämpeln.