Platforma podpisywania cyfrowego konwencji open packaging
David Meltzer i Andrey Shur
Microsoft Corporation
Wrzesień 2006 r.
Dotyczy:
OPC Digital Signing Framework
Standard podpisu cyfrowego W3C XML
Microsoft .NET 3.0 Framework
Podsumowanie: omawia platformę podpisywania cyfrowego OPC, zapewniając przegląd składników pakietu i usług pomocniczych oraz przykłady zasad podpisywania i jej implementacji. (12 stron drukowanych)
Zawartość
Wprowadzenie
Składniki struktury podpisywania cyfrowego OPC
Standard podpisu cyfrowego XML
Reprezentowanie podpisów cyfrowych w pakietach
Podpisywanie części i relacji
Obsługa programowania dla podpisów pakietów
Podpisywanie części pakietów i relacji
Weryfikowanie certyfikatów i podpisów
Zasady podpisywania aplikacji
Dokumenty XPS
Obsługa programowania dla podpisów XPS
Odwołania
Wprowadzenie
Model pakowania określony przez konwencje open packaging (OPC) opisuje pakiety, części i relacje. Pakiety przechowują części, które przechowują zawartość i zasoby. Relacje są definiowane w celu połączenia pakietu z częściami i łączenia różnych części w pakiecie.
W tym artykule omówiono platformę podpisywania cyfrowego OPC, zapewniając przegląd składników pakietu i usług pomocniczych oraz przykłady zasad podpisywania i jej implementacji.
Struktura podpisywania zawiera infrastrukturę do reprezentowania podpisów cyfrowych oraz usług do tworzenia i weryfikowania podpisów. Struktura podpisywania umożliwia stosowanie standardu W3C XML Digital Signature do części pakietów i relacji.
Korzystając z platformy podpisywania, właściciele formatów opartych na pakietach definiują i implementują zasady podpisywania specyficzne dla ich formatów. Zasady określają sposób podpisywania i weryfikowania całkowitej zawartości określonych formatów oraz uosabiania sposobu użycia podpisów dla różnych przepływów pracy. W rzeczywistości w przypadku pojedynczego formatu może istnieć kilka zasad zdefiniowanych do użycia na różnych etapach cyklu życia dokumentu.
Zasady podpisywania dla formatu opartego na pakiecie są wyrażane pod względem podpisywania części i relacji oraz ewentualnie innych cech dokumentu (takich jak walidacja zamierzonego urządzenia wyświetlania, głębokości kolorów lub wersji aplikacji). Zasady podpisywania określają, które składniki dokumentu mają być podpisywane i które należy pozostawić bez znaku, jeśli istnieją. Można na przykład zaimplementować zasady podpisywania, aby umożliwić dodawanie nowych części i relacji do pakietu lub zasady mogą spowodować unieważnienie podpisu, jeśli nowe części lub podpisy zostaną dodane do pakietu.
W tym artykule przyjęto założenie, że znajomość specyfikacji Open Packaging Conventions oraz rekomendacji W3C XML-Signature Składnia i przetwarzanie.
Składniki struktury podpisywania cyfrowego OPC
Standard podpisu cyfrowego XML
Struktura podpisywania dla pakietów używa standardu PODPISU cyfrowego XML zgodnie z definicją w składni i przetwarzaniu rekomendacji W3C XML-Signature. To zalecenie określa reguły składni i przetwarzania XML do tworzenia i przechowywania podpisów cyfrowych.
Standard definiuje typ elementu podpisu XML, schemat i wymagania zgodności dotyczące podpisywania i weryfikowania dowolnego rodzaju zasobu cyfrowego. Schemat definiuje również elementy służące do odwoływania się do zasobów i określania algorytmów związanych z podpisem.
Funkcje podpisów cyfrowych
Podpis cyfrowy może służyć do określenia, czy podpisana zawartość została zmieniona od momentu podpisania. Podpis zawiera manifest zawartości, który jest skrótem zgodnie z dobrze znanym algorytmem i przechowywanym w podpisie podczas tworzenia. Aby określić, czy zawartość uległa zmianie, skrót podpisanej zawartości jest ponownie utworzony i porównywany z skrótem przechowywanym w podpisie.
Podpis cyfrowy może również służyć do identyfikowania podpisywania zawartości. Tożsamość podpisywania jest reprezentowana przez certyfikat skojarzony z podpisem. Certyfikat może być osadzony w podpisie lub dostępny w innym miejscu.
Podpis cyfrowy nie blokuje dokumentu ani nie powoduje jego zaszyfrowania (chociaż może być już zaszyfrowany). Zawartość dokumentu pozostaje niezmieniona po podpisaniu. Podpisy cyfrowe nie uniemożliwiają wyświetlania podpisanej zawartości przez niezamierzonych użytkowników.
Reprezentowanie podpisów cyfrowych w pakietach
Aplikacje zawierają podpisy cyfrowe w pakiecie przy użyciu określonej konfiguracji części i relacji.
Struktura podpisywania używa elementów i atrybutów z przestrzeni nazw pakietów, gdzie jest to dozwolone przez standard podpisu cyfrowego XML. Elementy podpisu zdefiniowane w przestrzeni nazw pakietów obsługują funkcje specyficzne dla pakietu, które rozszerzają standard bez zaprzeczania temu. Aby uzyskać podsumowanie dodatków, zobacz sekcję "Modyfikacje specyfikacji podpisu cyfrowego XML" specyfikacji OPC.
Części pakietu zdefiniowane dla platformy podpisywania to część źródłowa, część Podpis XML i część Certyfikat. Każdy z nich ma dobrze zdefiniowany typ zawartości. Dobrze zdefiniowane typy relacji są używane do łączenia części podpisów w pakiecie, jak określono w dodatku H, "Standardowe przestrzenie nazw i typy zawartości", specyfikacji OPC.
Część źródła podpisu cyfrowego
Część Źródła podpisu cyfrowego to punkt wyjścia do nawigowania po podpisach w pakiecie. Część Źródło podpisu cyfrowego jest przeznaczona dla katalogu głównego pakietu przy użyciu relacji Źródła podpisu cyfrowego . Wiele części podpisów może być przeznaczonych dla części Origin. Jeśli w pakiecie nie ma podpisów, część Origin nie będzie obecna.
Część podpisu cyfrowego XML
Części podpisu XML podpisu cyfrowego zawierają znaczniki zdefiniowane w standardzie W3C Digital Signature, a także w przestrzeni nazw pakowania. Części są przeznaczone dla części XML źródła podpisu cyfrowego z relacją Podpis cyfrowy .
Część certyfikatu podpisu cyfrowego
Certyfikat X.509 wymagany do identyfikacji osoby podpisającego, jeśli został umieszczony w pakiecie, może zostać osadzony w części Podpis XML lub przechowywany w oddzielnej części certyfikatu. Opcjonalna część Certyfikat jest przeznaczona dla części Podpis XML z relacją Certyfikat podpisu cyfrowego . Część Certyfikat może być współużytkowana między wieloma częściami podpisu.
Niestandardowe części podpisu
Niestandardowe (specyficzne dla aplikacji) części podpisu są dozwolone, ale nie są obsługiwane przez platformę podpisywania. Część podpisu, która zawiera postać podpisu innego niż podpis XML, musi być identyfikowana przez niestandardowy typ zawartości. Ponadto relacja z niestandardowym typem relacji musi być używana do kierowania części ze strony źródła podpisu cyfrowego.
Podpisywanie części i relacji
Standard podpisu cyfrowego XML umożliwia podpisywanie adresowalnych zasobów, które dla pakietu są częściami. Platforma podpisywania umożliwia podpisywanie części. Relacje w pakiecie, przechowywane w części relacji, mogą być podpisane jednocześnie lub podzestaw relacji można określić na potrzeby podpisywania.
Typ zawartości części jest podpisany wraz z zawartością części, aby upewnić się, że część w prawidłowym podpisanym pakiecie będzie używana lub renderowana zgodnie z oczekiwaniami. Ponieważ typ zawartości nie jest zasobem adresowalnym, podejście specyficzne dla pakietu jest podejmowane do podpisywania wartości typu zawartości. Po podpisaniu pakietu typ zawartości każdej podpisanej części jest przechowywany w składniku zapytania identyfikatora URI odwołującego się do podpisanej części. Gdy pakiet jest używany, platforma podpisywania cyfrowego OPC używa wartości typu zawartości, aby upewnić się, że typ zawartości części nie uległ zmianie od momentu podpisania części.
Gdy część relacji jest podpisana jako całość, wszystkie relacje zdefiniowane w tej części są podpisane. Aby obsługiwać zasady podpisywania, które umożliwiają zmianę niektórych zawartości pakietu bez unieważnienia podpisu, platforma podpisywania zapewnia mechanizm podpisywania określonych relacji. Aby podpisać określone relacje, struktura podpisywania używa specjalnej transformacji, transformacji relacji (zobacz Transform Algorithms).
Przekształcenie relacji tworzy część relacji zawierającą tylko określony zestaw relacji. Część uzyskana relacje służy do podpisywania i podczas walidacji podpisu.
Obsługa programowania dla podpisów pakietów
Aby podpisać i zweryfikować podpisy, aplikacje mogą używać klas .NET 3.0 PackageDigitalSignatureManager. Klasy specyficzne dla pakietu zdefiniowane w przestrzeni nazw System.IO.Packaging opierają się na klasach podpisów cyfrowych platformy Microsoft .NET 3.0 Framework zdefiniowanych w przestrzeni nazw System.Security.Cryptography.Xml .
Klasa PackageDigitalSignatureManager służy do tworzenia i weryfikowania podpisów oraz umieszczania infrastruktury podpisów w pakiecie. Podpis jest reprezentowany przez obiekt na podstawie klasy PackageDigitalSignature .
Podpisywanie części pakietów i relacji
Aplikacja definiuje listę części i relacji do podpisania zgodnie z zasadami podpisywania. Następnie aplikacja wywołuje metodę PackageDigitalSignatureManager.Sign() w celu utworzenia podpisu i dodania infrastruktury podpisów do pakietu.
Poniższy przykładowy kod pokazuje podpisywanie wszystkich części pakietu z wyjątkiem części relacji, podpisywanie wszystkich istniejących relacji pochodzących z katalogu głównego pakietu i osadzanie certyfikatu używanego do logowania w części Podpis XML. Przykładowy kod zakłada, że nie istnieją podpisy w pakiecie na początku, a przed weryfikacją zastosowano tylko jeden podpis.
Rozpoczynanie procesu podpisywania
Aby rozpocząć pracę z podpisami w pakiecie, najpierw utwórz element PackageDigitalSignatureManager, jak pokazano poniżej.
// Open the package.
Package package = Package.Open(filename);
// Create the PackageDigitalSignatureManager
PackageDigitalSignatureManager dsm =
new PackageDigitalSignatureManager(package);
Opcje osadzania certyfikatu
Certyfikat może być reprezentowany jako ciąg osadzony w samym podpisie jako oddzielna część pakietu lub jako zasób poza pakietem. Jeśli certyfikat ma zostać umieszczony w pakiecie, aplikacja określa sposób utrwalania certyfikatu przy użyciu opcji osadzania właściwości PackageDigitalSignature.CertificateOption . Po utworzeniu klasy PackageDigitalSignatureManager są ustawione opcje osadzania certyfikatu, jak pokazano w poniższym przykładowym kodzie.
//Specify that the certificate is embedded in the signature held
//in the XML Signature part.
//Certificate embedding options include:
// InSignaturePart – Certificate is embedded in the signature.
// InCertificatePart – Certificate is embedded in a
// separate certificate part
dsm.CertificateOption =
CertificateEmbeddingOption.InSignaturePart;
Lista podpisanych części
Lista części do podpisania jest określona przy użyciu identyfikatorów URI odnoszących się do części. W tym przykładzie wszystkie części pakietu zostaną podpisane z wyjątkiem części relacji, które są filtrowane przy użyciu metody PackUriHelper.IsRelationshipPartUri().
//Initialize a list to hold the part URIs to sign.
System.Collections.Generic.List<Uri> partsToSign =
new System.Collections.Generic.List<Uri>();
//Add each part to the list, except relationships parts.
foreach (PackagePart packagePart in package.GetParts())
{
if (!PackUriHelper.IsRelationshipPartUri(packagePart.Uri))
partsToSign.Add(packagePart.Uri);
}
Lista podpisanych relacji
Poszczególne relacje są podpisane przy użyciu przekształcenia relacji. Podpisywanie relacji w ten sposób umożliwia dodawanie nowych relacji do pakietu bez unieważniania podpisu.
Relacje są wybierane do podpisywania przez utworzenie listy obiektów PackageRelationshipSelector , które będą używane podczas podpisywania. Obiekty PackageRelationshipSelector można utworzyć jako grupę według typu relacji (zgodnie z definicją w sekcji "Standardowe przestrzenie nazw i typy zawartości" konwencji otwierania pakietów) lub utworzone indywidualnie, określając identyfikator relacji, jak w poniższym przykładzie.
//Create list of selectors for the list of relationships
List<PackageRelationshipSelector> relationshipSelectors =
new List<PackageRelationshipSelector>();
//Create one selector for each package-level relationship, based on id
foreach (PackageRelationship relationship in package.GetRelationships())
{
relationshipSelectors.Add(new
PackageRelationshipSelector(relationship.sourceUri,
PackageRelationshipSelectorType.Id, relationship.Id));
}
Podczas tworzenia elementu PackageRelationshipSelector z PackageRelationshipSelectorType.Id zostanie wybrana jedna relacja o określonym unikatowym identyfikatorze do podpisania. Podczas tworzenia selektora z parametrem PackageRelationshipSelectorType.Type wszystkie relacje z określonym typem są wybierane do podpisywania. Jeśli relacje tego samego typu zostaną później dodane do pakietu, podpis zostanie unieważniony.
Tworzenie obiektu certyfikatu
Przed podpisaniem prawidłowy certyfikat X.509 jest uzyskiwany przez utworzenie wystąpienia obiektu typu System.Security.Cryptography.X509Certificates.X509Certificate2. Ten obiekt jest przekazywany do metody PackageDigitalSignatureManager.Sign() podczas podpisywania . Aby uzyskać więcej informacji na temat tworzenia obiektów certyfikatów, zobacz przestrzeń nazw System.Security.Cryptography.X509Certificates .
Stosowanie podpisu
Po utworzeniu listy części i relacji do podpisania i uzyskaniu obiektu certyfikatu aplikacja wywołuje metodę PackageDigitalSignatureManager.Sign().
//Sign package using components created above
PackageDigitalSignature signature = dsm.Sign(partsToSign,
x509Certificate, relationshipSelectors);
//After signing, close the package.
//The signature will be persisted in the package.
package.Close();
Po wywołaniu metody Sign() skrót jest generowany i przechowywany w manifeście podpisu, a część podpisu jest tworzona. Jeśli infrastruktura sygnatur już istnieje w pakiecie, zostanie dodana nowa część podpisu (jeśli jest dozwolona). Jeśli infrastruktura jeszcze nie istnieje w pakiecie, metoda Sign() tworzy infrastrukturę i umieszcza ją w pakiecie.
Weryfikowanie certyfikatów i podpisów
Aplikacje mogą zweryfikować certyfikat lub podpis. Przed zweryfikowaniem podpisu należy zweryfikować certyfikat. Obiekt reprezentujący podpis w pakiecie PackageDigitalSignature ma właściwość "Signer", która zwraca certyfikat używany do tworzenia tego podpisu, jeśli znajduje się w pakiecie. Jeśli certyfikat nie jest osadzony w pakiecie, aplikacja uzyskuje certyfikat z lokalizacji znanej aplikacji.
Metoda PackageDigitalSignatureManager.VerifyCertificate() służy do weryfikowania uzyskanego certyfikatu, sprawdzania struktury certyfikatu, daty wygaśnięcia i stanu łańcucha. Aby uzyskać więcej informacji na temat stanu łańcucha, zobacz X509ChainStatusFlag Enumeration w bibliotece klas .NET Framework.
Deweloperzy aplikacji mogą używać stanu certyfikatu do obsługi zasad podpisywania. Na przykład aplikacja może określić, że dopuszczalne są tylko certyfikaty wystawione po określonych datach.
Metoda PackageDigitalSignatureManager.VerifySignatures() służy do weryfikowania wszystkich podpisów w pakiecie. Ta metoda weryfikuje tylko podpisy, a nie certyfikaty skojarzone z podpisami.
Poniższy przykładowy kod może służyć do weryfikowania certyfikatu i podpisu umieszczonego w pakiecie w przykładach podpisywania. Przykładowy kod zakłada, że do pakietu nie dodano żadnych dodatkowych podpisów.
// Open the package.
Package package = Package.Open(filename);
// Create the PackageDigitalSignatureManager
PackageDigitalSignatureManager dsm =
new PackageDigitalSignatureManager(package);
// Verify the collection of certificates in the package (one, in this case)
foreach(PackageDigitalSignature signature in pdsm.Signatures)
{
if(PackageDigitalSignatureManager.VerifyCertificate(signature.Signer)
!= X509ChainStatusFlags.NoError)
{
// Application-specific code for error handling
// or certificate validation
}
}
// For this example, if all certificates are valid,
// verify all signatures in the package.
VerifyResult vResult = dsm.VerifySignatures(false);
Console.WriteLine("Result " + vResult.ToString());
// Close the package.
package.Close();
Zasady podpisywania aplikacji
Aplikacje korzystające z formatów opartych na pakietach definiują własne zasady w ramach struktury podpisywania. Zasady są określane przez typy elementów i wymagania dotyczące przepływu pracy w formacie. W tej sekcji opisano zasady podpisywania dla jednego formatu opartego na pakiecie firmy Microsoft: formatu dokumentu XPS.
Dokumenty XPS
Format dokumentu XPS jest oparty na konwencjach open packaging, jak określono w specyfikacji papieru XML. Specyfikacja papieru XML definiuje zasady podpisywania dokumentów XPS. W ramach tych zasad dostępne są opcje podpisywania umożliwiające obsługę funkcji aplikacji lub przepływu pracy.
Zasady podpisywania pakietów dokumentów XPS
Zasady podpisywania dla dokumentów XPS opisują zestaw części i relacji, które muszą być podpisane, aby można było zweryfikować zawartość. W ramach tych zasad aplikacja może utworzyć podpis, który opcjonalnie zawiera kombinację określonych części, które są adjunct do zawartości, takie jak część CoreProperties. Podpisywanie tych części uniemożliwi ich zmianę bez unieważnienia podpisu. Ponadto aplikacje mogą opcjonalnie podpisać część relacji dołączoną do części Źródła podpisu cyfrowego w podpisie, uniemożliwiając dodawanie nowych podpisów do dokumentu bez unieważniania podpisu.
Aby podpis był prawidłowy, zasady podpisywania dokumentów XPS wymagają, aby niektóre części i relacje były uwzględniane w podpisie. Nie można podpisać nierozpoznanych części ani relacji. Podczas weryfikowania podpisu aplikacja musi potwierdzić, że wszystkie wymagane części i relacje są podpisane.
Części dokumentów XPS do podpisania
Poniższa tabela zawiera listę części, które muszą być podpisane we wszystkich dokumentach XPS, oraz części, które są opcjonalnie podpisane. W przypadku relacji zasady podpisywania XPS określają, że wymagane relacje (relacje przeznaczone dla wymaganych części) są zawsze podpisane przy użyciu przekształcenia relacji zdefiniowanych przez OPC. Jeśli część jest podpisana, relacje docelowe muszą być również podpisane.
Typ części | Zasady |
---|---|
FixedDocumentSequence, część | Musi być podpisany |
Część FixedDocument | Musi być podpisany |
Części documentStructure | Musi być podpisany |
Część SignatureDefinitions | Musi być podpisany |
Części fixedPage | Musi być podpisany |
Wymagane części zasobów (takie jak czcionki, obrazy) | Musi być podpisany |
Części storyFragments | Musi być podpisany |
Części miniatur | Musi być podpisany |
Część CoreProperties | Opcjonalnie podpisany |
Część Źródła podpisu cyfrowego | Opcjonalnie podpisany |
Część Certyfikat podpisu cyfrowego | Opcjonalnie podpisany |
Części printTicket | Opcjonalnie podpisany |
Odrzuć części | Opcjonalnie podpisany |
Aby uzyskać więcej informacji na temat zasad podpisywania XPS, zobacz sekcję "Funkcje pakietu dokumentów XPS: podpisy cyfrowe: reguły podpisywania" w specyfikacji papieru XML.
Zasady podpisywania zgodności znaczników
Specyfikacja papieru XML opisuje sposób dołączania alternatywnej zawartości w dokumencie XPS: zgodność znaczników. Zawartość alternatywna jest umieszczana w elementach z przestrzeni nazw Zgodności znaczników. Zgodnie z zasadami dokumenty XPS, które mają elementy zgodności markup i atrybuty, nie mogą być prawidłowe podpisane, chyba że aplikacja podpisywania rozpoznaje wszystkie alternatywy zawartości jako równoważne. Tylko dokumenty XPS zawierające elementy i atrybuty, które są rozpoznawane, mogą być podpisane lub zweryfikowane.
Kontrasygnatur
Do zawartości dokumentu XPS można zastosować więcej niż jeden podpis. Na przykład zawartość reprezentująca umowę prawną może wymagać od kilku osób zastosowania podpisów, wskazujących zawartość podpisaną i tożsamość osoby podpisjącej.
Dodanie nowego podpisu zawsze tworzy nową relację w ramach części relacji dołączonej do części Źródła podpisu cyfrowego. Aby dodać nowe podpisy do dokumentu XPS bez unieważniania istniejących podpisów, ta część relacji musi pozostać niepodpisane (chociaż podzbiór relacji może być podpisany). Jeśli część relacji jest uwzględniona w podpisie, podpis ten zostanie unieważniony przez wszystkie następnie zastosowane podpisy.
Weryfikowanie podpisów XPS
Oprócz definiowania tworzenia podpisów zasady podpisywania XPS określają również sposób weryfikowania podpisu jako prawidłowego. Zasady definiują stany ważności podpisu, które zawierają niezgodne, uszkodzone, wątpliwe i prawidłowe, jak pokazano w poniższej tabeli.
Stan podpisu | Wszystkie wymagane części i relacje są podpisane? | Podpis zawiera tylko rozpoznaną zawartość? | Zweryfikowano skrót podpisanej zawartości? | Rozpoznana jest podpisana zawartość zgodności ze znacznikami? | Certyfikat jest prawidłowy? |
---|---|---|---|---|---|
Niezgodne | NO TAK |
n/d NO |
nie dotyczy nie dotyczy |
nie dotyczy nie dotyczy |
nie dotyczy nie dotyczy |
Złamane | TAK | TAK | NO | nie dotyczy | nie dotyczy |
Wątpliwe | TAK TAK |
TAK TAK |
TAK TAK |
NO TAK |
n/d NO |
Prawidłowe | TAK | TAK | TAK | TAK | TAK |
Przeglądarka XPS wyświetla wątpliwe i uszkodzone podpisy XPS, a także prawidłowe podpisy XPS. Niezgodne podpisy nie są wyliczane.
Obsługa programowania dla podpisów XPS
Podczas pracy z dokumentem XPS aplikacje mogą używać metod w klasie XpsDigitalSignature . Ta klasa jest oparta na klasie PackageDigitalSignature i zawiera metody zgodne z algorytmami i wymaganiami określonymi w specyfikacji podpisu cyfrowego XPS. Metody podpisywania i walidacji sprawdzają, czy wszystkie wymagane części i relacje dokumentu XPS są podpisane.
Podpisywanie dokumentu XPS
Metoda XpsDocument.SignDigitally() służy do podpisywania dokumentu XPS. Przed wywołaniem metody aplikacja musi mieć certyfikat X.509, który można uzyskać przy użyciu obiektu System.Security.Cryptography.X509Certificates.X509Certificate2.
// Open the XPS Document
XpsDocument document = new XpsDocument(dstContainer,
FileAccess.ReadWrite);
// Obtain the certificate object from a file
X509Certificate certificate =
509Certificate.CreateFromCertFile(certFilename);
// Create the signature and add it to the document using
// the OPC Signing Framework
document.SignDigitally(certificate, true,
XpsDigSigPartAlteringRestrictions.None);
XpsDigSigPartAlteringRestrictions może służyć do określania dodatkowych ograniczeń dla podpisu na podstawie zasad podpisywania. Ten parametr określa, czy należy wykluczyć części CoreMetadata i/lub SignatureOrigin z podpisu. Wykluczone części można następnie zmienić później bez unieważnienia podpisu. Na przykład wyłączenie części CoreMetadata z podpisu umożliwia aplikacji zmianę niektórych właściwości dokumentu bez unieważniania podpisu.
Części PrintTicket i DiscardControl są wykluczone z podpisów utworzonych przez metodę SignDigitally(), chociaż te części mogą być opcjonalnie podpisane w sposób specyficzny dla aplikacji.
Weryfikowanie podpisu dokumentu XPS
Jeden lub wiele podpisów może być przechowywany z dokumentem XPS. Podpisy można uzyskać z właściwości XpsDocument.Signatures . Każdy podpis jest reprezentowany przez wystąpienie obiektu XpsDigitalSignature .
W poniższym przykładzie zweryfikowano tylko pierwszy podpis w kolekcji.
// Open the XPS Document.
// Obtain the first enumerated signature.
foreach (XpsDigitalSignature digitalSignature in
document.Signatures)
{
// Verify the signature object, if present.
if (digitalSignature.Verify() ==
System.IO.Packaging.PackageDigitalSignature.VerifyResult.Success)
{
//Signature is valid
}
}