Framework di firma digitale delle convenzioni open packaging

 

David Meltzer e Andrey Shur
Microsoft Corporation

Settembre 2006

Si applica a:
   Framework di firma digitale OPC
   Standard W3C XML Digital Signature
   Microsoft .NET 3.0 Framework

Riepilogo: illustra il framework di firma digitale OPC, fornendo una panoramica dei componenti del pacchetto e dei servizi di supporto e esempi di criteri di firma e dell'implementazione. (12 pagine stampate)

Contenuto

Introduzione
Componenti del framework di firma digitale OPC
   The XML Digital Signature Standard
   Rappresentazione delle firme digitali nei pacchetti
   Parti e relazioni di firma
Supporto per la programmazione per le firme dei pacchetti
   Firma di parti e relazioni del pacchetto
   Verifica dei certificati e delle firme
Criteri di firma dell'applicazione
   Documenti XPS
   Supporto per la programmazione per le firme XPS
Riferimenti

Introduzione

Il modello di creazione di pacchetti specificato da Open Packaging Conventions (OPC) descrive i pacchetti, le parti e le relazioni. I pacchetti contengono parti, che contengono contenuto e risorse. Le relazioni sono definite per connettere il pacchetto alle parti e per connettere varie parti nel pacchetto.

Questo articolo illustra il framework di firma digitale OPC, fornendo una panoramica dei componenti del pacchetto e dei servizi di supporto e esempi di criteri di firma e relativa implementazione.

Il framework di firma include un'infrastruttura per rappresentare firme digitali e i servizi per la creazione e la convalida delle firme. Il framework di firma consente l'applicazione dello standard W3C XML Digital Signature alle parti e alle relazioni dei pacchetti.

Usando Sign Framework, i proprietari dei formati basati su pacchetti definiscono e implementano i "criteri di firma" specifici dei formati. I criteri specificano come firmare e convalidare il contenuto integrale di formati specifici e incorporare la modalità di utilizzo delle firme per flussi di lavoro diversi. Infatti, per un singolo formato possono essere definiti diversi criteri per l'uso in fasi diverse nel ciclo di vita di un documento.

I criteri di firma per un formato basato sul pacchetto sono espressi in termini di parti e relazioni di firma e altre caratteristiche del documento, ad esempio la convalida del dispositivo di visualizzazione previsto, la profondità dei colori o la versione dell'applicazione. Un criterio di firma specifica i componenti del documento da firmare e quali lasciare senza segno, se presenti. Ad esempio, un criterio di firma può essere implementato per consentire l'aggiunta di nuove parti e relazioni a un pacchetto oppure un criterio può causare l'invalidazione di una firma se vengono aggiunte nuove parti o firme a un pacchetto.

Questo articolo presuppone familiarità con la specifica Open Packaging Conventions e la sintassi e l'elaborazione della sintassi e dell'elaborazione di raccomandazioni XML-Signature W3C.

Componenti del framework di firma digitale OPC

The XML Digital Signature Standard

Il framework di firma per i pacchetti usa lo standard di firma digitale XML, come definito nella sintassi e nell'elaborazione della sintassi e della firma XML di raccomandazione W3C. Questa raccomandazione specifica le regole di elaborazione e sintassi XML per la produzione e l'archiviazione di firme digitali.

Lo standard definisce un tipo di elemento di firma XML, uno schema e i requisiti di conformità per la firma e la convalida di qualsiasi tipo di risorsa digitale. Lo schema definisce anche gli elementi per fare riferimento alle risorse e specificare algoritmi correlati alla firma.

Funzionalità delle firme digitali

Una firma digitale può essere usata per determinare se il contenuto firmato è stato modificato dopo la firma. La firma contiene un manifesto di contenuto che viene hashato in base a un algoritmo noto e archiviato nella firma al momento della creazione. Per determinare se il contenuto è stato modificato, viene ricreato un hash del contenuto firmato e confrontato con l'hash archiviato all'interno della firma.

Una firma digitale può essere usata anche per identificare il segno del contenuto. L'identità del firmatario è rappresentata da un certificato associato alla firma. Il certificato può essere incorporato nella firma o disponibile altrove.

Una firma digitale non blocca un documento o causa la crittografia (anche se potrebbe essere già crittografata). Il contenuto del documento rimane invariato dopo la firma. Le firme digitali non impediscono la visualizzazione del contenuto firmato da utenti non intenzionali.

Rappresentazione delle firme digitali nei pacchetti

Le applicazioni includono firme digitali in un pacchetto usando una configurazione specificata di parti e relazioni.

Il Framework di firma usa elementi e attributi dallo spazio dei nomi dei pacchetti in cui è consentito dallo standard firma digitale XML. Gli elementi di firma definiti nello spazio dei nomi dei pacchetti supportano funzionalità specifiche del pacchetto che aumentano lo standard senza contraddirlo. Per un riepilogo delle aggiunte, vedere la sezione "Modifiche alla specifica della firma digitale XML" della specifica OPC.

Le parti del pacchetto definite per Il framework di firma sono la parte Origin, la parte firma XML e la parte Certificato. Ogni oggetto ha un tipo di contenuto ben definito. I tipi di relazione ben definiti vengono usati per connettere le parti di firma in un pacchetto, come specificato in Appendice H, "Spazi dei nomi standard e tipi di contenuto", della specifica OPC.

Parte origine firma digitale

La parte Origine firma digitale è il punto di partenza per spostarsi tra le firme in un pacchetto. La parte Origine firma digitale è destinata alla radice del pacchetto usando la relazione Digital Signature Origin . È possibile che più parti di firma siano destinate alla parte Origin. Se non sono presenti firme nel pacchetto, la parte Origin non sarà presente.

Parte firma XML firma digitale

Le parti firma XML firma digitale contengono il markup definito nello standard W3C Digital Signature e nello spazio dei nomi dei pacchetti. Le parti sono destinate all'XML della parte Origine firma digitale con la relazione Firma digitale .

Parte del certificato di firma digitale

Il certificato X.509 necessario per identificare il firmatario, se inserito nel pacchetto, può essere incorporato nella parte firma XML o archiviato in una parte di certificato separata. La parte del certificato facoltativo è destinata alla parte firma XML con la relazione Certificato firma digitale . La parte Certificato può essere condivisa tra più parti di firma.

Parti di firma personalizzate

Le parti di firma personalizzate (specifiche dell'applicazione) sono consentite, ma non gestite dal Framework di firma. Una parte di firma che contiene una forma di firma diversa da una firma XML deve essere identificata da un tipo di contenuto personalizzato. Inoltre, una relazione con un tipo di relazione personalizzata deve essere usata per indirizzare la parte dalla parte Digital Signature Origin.

Parti e relazioni di firma

Lo standard di firma digitale XML consente la firma delle risorse indirizzabili, che per un pacchetto sono parti. Il framework di firma abilita la firma delle parti. Le relazioni in un pacchetto, archiviate in una parte di relazioni, possono essere firmate tutte contemporaneamente o un subset di relazioni può essere specificato per la firma.

Il tipo di contenuto di una parte viene firmato, insieme al contenuto della parte, per assicurarsi che una parte in un pacchetto con firma valida venga usata o sottoposta a rendering come previsto. Poiché il tipo di contenuto non è una risorsa indirizzabile, viene eseguito un approccio specifico del pacchetto per firmare il valore del tipo di contenuto. Quando il pacchetto viene firmato, il tipo di contenuto di ogni parte firmata viene archiviato nel componente di query dell'URI che fa riferimento alla parte firmata. Quando viene utilizzato il pacchetto, il framework di firma digitale OPC usa il valore del tipo di contenuto per assicurarsi che il tipo di contenuto della parte non sia stato modificato dopo la firma della parte.

Quando la parte relazioni viene firmata nel suo complesso, tutte le relazioni definite in tale parte vengono firmate. Per supportare i criteri di firma che consentono ad alcuni contenuti di un pacchetto di modificare senza invalidare la firma, il Framework di firma fornisce un meccanismo per la firma delle relazioni specificate. Per firmare le relazioni specificate, Il Framework di firma usa una trasformazione speciale, la trasformazione Relazioni (vedere Transform Algorithms).

La trasformazione Relazioni crea una parte delle relazioni contenente solo il set specificato di relazioni. La parte relazioni ottenuta viene usata per la firma e durante la convalida della firma.

Supporto per la programmazione per le firme dei pacchetti

Per firmare e convalidare le firme, le applicazioni possono usare le classi .NET 3.0 PackageDigitalSignatureManager. Le classi specifiche del pacchetto, definite nello spazio dei nomi System.IO.Packaging , si basano sulle classi di firma digitale di Microsoft .NET 3.0 Framework definite nello spazio dei nomi System.Security.Cryptography.Xml .

La classe PackageDigitalSignatureManager viene usata per la creazione e la convalida delle firme e l'inserimento dell'infrastruttura di firma in un pacchetto. La firma è rappresentata da un oggetto basato sulla classe PackageDigitalSignature .

Firma di parti e relazioni del pacchetto

Un'applicazione definisce un elenco di parti e relazioni da firmare in base ai criteri di firma. L'applicazione chiama quindi il metodo PackageDigitalSignatureManager.Sign() per creare la firma e aggiungere l'infrastruttura di firma al pacchetto.

Il codice di esempio seguente illustra la firma di tutte le parti del pacchetto, ad eccezione delle parti di relazioni, la firma di tutte le relazioni esistenti provenienti dalla radice del pacchetto e l'incorporamento del certificato usato per l'accesso nella parte firma XML. Il codice di esempio presuppone che nel pacchetto non esistano firme all'inizio e venga applicata una sola firma prima della verifica.

Inizio del processo di firma

Per iniziare a usare le firme nel pacchetto, creare innanzitutto packageDigitalSignatureManager, come illustrato di seguito.

    // Open the package.
    Package package = Package.Open(filename);

    // Create the PackageDigitalSignatureManager
      PackageDigitalSignatureManager dsm =
        new PackageDigitalSignatureManager(package);

Opzioni di incorporamento dei certificati

Un certificato può essere rappresentato come stringa incorporata nella firma stessa, come parte separata nel pacchetto o come risorsa esterna al pacchetto. Se il certificato deve essere inserito all'interno del pacchetto, un'applicazione specifica come il certificato verrà salvato in modo permanente usando le opzioni di incorporamento della proprietà PackageDigitalSignature.CertificateOption . Dopo aver creato la classe PackageDigitalSignatureManager , vengono impostate le opzioni di incorporamento per il certificato, come illustrato nel codice di esempio seguente.

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

Elenco parti firmate

L'elenco di parti da firmare viene specificato usando gli URI che puntano alle parti. In questo esempio tutte le parti del pacchetto verranno firmate ad eccezione delle parti delle relazioni, filtrate usando il metodo 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);
  }

Elenco relazioni firmate

Le singole relazioni vengono firmate usando la trasformazione Relazioni. Le relazioni di firma in questo modo consentono di aggiungere nuove relazioni al pacchetto senza invalidare la firma.

Le relazioni vengono selezionate per la firma creando un elenco di oggetti PackageRelationshipSelector che verranno usati al momento della firma. Gli oggetti PackageRelationshipSelector possono essere creati come gruppo per tipo di relazione (come definito nella sezione "Spazi dei nomi standard e tipi di contenuto" di Open Packaging Conventions) o creati singolarmente specificando l'ID relazione, come nell'esempio seguente.

     //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));
            }

Quando si crea un oggetto PackageRelationshipSelector con PackageRelationshipSelectorType.Id, verrà selezionata la relazione con l'ID univoco specificato per la firma. Quando si crea un selettore con PackageRelationshipSelectorType.Type, per la firma vengono selezionate tutte le relazioni con il tipo specificato. Se le relazioni dello stesso tipo vengono aggiunte successivamente a un pacchetto, la firma verrà invalidata.

Creazione dell'oggetto Certificate

Prima della firma, viene ottenuto un certificato X.509 valido creando un'istanza di un oggetto di tipo System.Security.Cryptography.X509Certificates.X509Certificate2. Questo oggetto viene passato al metodo PackageDigitalSignatureManager.Sign() al momento della firma. Per altre informazioni sulla creazione di oggetti certificato, vedere lo spazio dei nomi System.Security.Cryptography.X509Certificates .

Applicazione della firma

Dopo aver creato l'elenco di parti e relazioni da firmare e ottenere l'oggetto certificato, un'applicazione chiama il metodo 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();

Quando viene chiamato il metodo Sign(), l'hash viene generato e archiviato nel manifesto della firma e viene creata la parte della firma. Se l'infrastruttura di firma esiste già nel pacchetto, la nuova parte della firma verrà aggiunta (se consentito). Se l'infrastruttura non esiste ancora nel pacchetto, il metodo Sign() crea l'infrastruttura e lo inserisce nel pacchetto.

Verifica di certificati e firme

Le applicazioni possono verificare un certificato o una firma. Prima di verificare la firma, è necessario verificare il certificato. L'oggetto che rappresenta la firma nel pacchetto PackageDigitalSignature ha una proprietà "Signer" che restituisce il certificato usato per la creazione della firma, se presente nel pacchetto. Se il certificato non è incorporato nel pacchetto, l'applicazione ottiene il certificato da una posizione nota all'applicazione.

Il metodo PackageDigitalSignatureManager.VerifyCertificate() viene usato per convalidare il certificato ottenuto, controllare la struttura del certificato, la data di scadenza e lo stato della catena. Per altre informazioni sullo stato della catena, vedere Enumerazione X509ChainStatusFlag nella libreria di classi .NET Framework.

Gli sviluppatori di applicazioni possono usare lo stato del certificato per supportare i criteri di firma. Ad esempio, un'applicazione può specificare che solo i certificati rilasciati dopo determinate date sono accettabili.

Il metodo PackageDigitalSignatureManager.VerifySignatures() viene usato per convalidare tutte le firme nel pacchetto. Questo metodo convalida solo le firme, non i certificati associati alle firme.

Il codice di esempio seguente può essere usato per convalidare il certificato e la firma inseriti nel pacchetto negli esempi di firma. Il codice di esempio presuppone che al pacchetto non siano state aggiunte firme aggiuntive.

    // 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();

Criteri di firma dell'applicazione

Le applicazioni che usano formati basati su pacchetti definiscono i propri criteri come parte di Signing Framework. I criteri sono determinati dai tipi di elemento e dai requisiti del flusso di lavoro del formato. In questa sezione i criteri di firma sono descritti per un formato basato su pacchetto Microsoft: il formato XPS Document.

Documenti XPS

Il formato del documento XPS si basa sulle convenzioni open packaging, come specificato nella specifica xml paper. La specifica xml paper definisce i criteri per la firma di documenti XPS. All'interno di tale criterio sono disponibili opzioni di firma per supportare le funzionalità dell'applicazione o il flusso di lavoro.

Criteri di firma per i pacchetti di documenti XPS

I criteri di firma per i documenti XPS descrivono il set di parti e relazioni che devono essere firmate in modo che il contenuto possa essere convalidato. Come parte di questo criterio, un'applicazione può creare una firma che include facoltativamente una combinazione di parti specifiche che sono aggiuntive al contenuto, ad esempio la parte CoreProperties. La firma di queste parti impedisce che vengano modificate senza invalidare la firma. Inoltre, le applicazioni possono firmare facoltativamente la parte delle relazioni associata alla parte Digital Signature Origin nella firma, vietando l'aggiunta di nuove firme al documento senza invalidare la firma.

Affinché una firma sia valida, il criterio di firma del documento XPS richiede che determinate parti e relazioni siano incluse nella firma. Non è possibile firmare parti o relazioni non riconosciute. Quando si verifica una firma, un'applicazione deve verificare che tutte le parti e le relazioni necessarie siano firmate.

Parti del documento XPS da firmare

La tabella seguente contiene l'elenco delle parti che devono essere firmate in tutti i documenti XPS e le parti firmate facoltativamente. Per le relazioni, il criterio di firma XPS specifica che le relazioni necessarie (relazioni destinate alle parti obbligatorie) vengono sempre firmate usando la trasformazione Relazioni definite da OPC. Se una parte è firmata, devono essere firmate anche le relazioni destinate.

Tipo parte Criteri
Parte FixedDocumentSequence Deve essere firmato
Parte FixedDocument Deve essere firmato
Parti DocumentStructure Deve essere firmato
Parte SignatureDefinitions Deve essere firmato
Parti FixedPage Deve essere firmato
Parti di risorsa necessarie (ad esempio tipi di carattere, immagini) Deve essere firmato
Parti StoryFragments Deve essere firmato
Parti di anteprima Deve essere firmato
Parte CoreProperties Firma facoltativa
Parte Origine firma digitale Firma facoltativa
Parte del certificato di firma digitale Firma facoltativa
Parti PrintTicket Firma facoltativa
Parti DiscardControl Firma facoltativa

Per altre informazioni sui criteri di firma XPS, vedere la sezione "XPS Document Package Features: Digital Signatures: Signing Rules" in XML Paper Specification.For more information about the XPS signing policy, see the section "XPS Document Package Features: Digital Signatures: Signing Rules" in the XML Paper Specification.

Criteri di firma di compatibilità dei markup

La specifica xml paper descrive un mezzo per includere contenuto alternativo in un documento XPS: compatibilità di markup. Il contenuto alternativo viene inserito all'interno di elementi dello spazio dei nomi Markup Compatibility. Per criterio, i documenti XPS con elementi e attributi di compatibilità di markup non possono essere firmati in modo valido, a meno che l'applicazione di firma non riconosca tutte le alternative al contenuto come equivalenti. Solo i documenti XPS contenenti elementi e attributi riconosciuti possono essere firmati o convalidati.

Controfirme

È possibile applicare più firme al contenuto di un documento XPS. Ad esempio, il contenuto che rappresenta un contratto legale può richiedere a più persone di applicare le firme, indicando il contenuto firmato e l'identità del firmatario.

L'aggiunta di una nuova firma crea sempre una nuova relazione all'interno della parte relazioni associata alla parte Origine firma digitale. Per aggiungere nuove firme a un documento XPS senza invalidare le firme esistenti, questa parte delle relazioni deve rimanere senza segno (anche se è possibile firmare un subset di relazioni). Se la parte relazioni è inclusa in una firma, tale firma verrà invalidata da tutte le firme successivamente applicate.

Convalida delle firme XPS

Oltre alla definizione della creazione della firma, i criteri di firma XPS specificano anche come verificare una firma come valida. Il criterio definisce gli stati di validità per una firma che include elementi incomplianti, interrotti, discutibili e validi, come illustrato nella tabella seguente.

Stato firma Tutte le parti e le relazioni necessarie vengono firmate? La firma include solo contenuto riconosciuto? L'hash del contenuto firmato viene verificato? Il contenuto di compatibilità del markup firmato viene riconosciuto? Certificato valido?
Incompliant NO

YES

n/d

NO

n/d

n/d

n/d

n/d

n/d

n/d

Rotto YES YES NO n/d n/d
Discutibile YES

YES

YES

YES

YES

YES

NO

YES

n/d

NO

Valido YES YES YES YES YES

Il visualizzatore XPS visualizza le firme XPS discutibili e interrotte, nonché le firme XPS valide. Le firme non conformi non vengono enumerate.

Supporto per la programmazione per le firme XPS

Quando si usa un documento XPS, le applicazioni possono usare i metodi nella classe XpsDigitalSignature . Questa classe si basa sulla classe PackageDigitalSignature e include metodi che seguono gli algoritmi e i requisiti specificati nella specifica di firma digitale XPS. I metodi di firma e convalida verificano che tutte le parti e le relazioni necessarie di un documento XPS siano firmate.

Firma di un documento XPS

Il metodo XpsDocument.SignDigitally() viene usato per firmare un documento XPS. Prima di chiamare il metodo, un'applicazione deve avere un certificato X.509, che può essere ottenuto usando l'oggetto 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 può essere usato per specificare restrizioni aggiuntive per una firma, in base ai criteri di firma. Questo parametro specifica se escludere le parti CoreMetadata e/o SignatureOrigin dalla firma. Le parti escluse possono quindi essere modificate in un secondo momento senza invalidare la firma. Ad esempio, escluso la parte CoreMetadata dalla firma consente a un'applicazione di modificare alcune proprietà del documento senza invalidare la firma.

Le parti PrintTicket e DiscardControl vengono escluse dalle firme create dal metodo SignDigitally(), anche se queste parti possono essere firmate facoltativamente in modo specifico dell'applicazione.

Verifica di una firma del documento XPS

Una o più firme possono essere archiviate con un documento XPS. Le firme possono essere ottenute dalla proprietà XpsDocument.Signatures . Ogni firma è rappresentata da un'istanza dell'oggetto XpsDigitalSignature .

Nell'esempio seguente viene verificata solo la prima firma nella raccolta.

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

Riferimenti