Condividi tramite


Firmare un documento

In questo argomento viene descritto come firmare un documento XPS.

Prima di usare gli esempi di codice seguenti nel programma, leggere la dichiarazione di non responsabilità in Common Digital Signature Programming Tasks (Attività comuni di programmazione delle firme digitali).

Per firmare un documento XPS, caricarlo prima in un gestore delle firme, come descritto in Inizializzare Gestione firme.

Per firmare un documento caricato in un gestore delle firme:

  1. Creare un'istanza di un'interfaccia IXpsSigningOptions .
  2. Impostare i criteri di firma.
  3. Impostare il metodo di firma. Le costanti stringa URI del metodo di firma sono definite in cryptxml.h. Per altre informazioni sui valori validi del metodo di firma, vedere IXpsSigningOptions::SetSignatureMethod.
  4. Impostare il metodo digest. Le costanti stringa URI del metodo digest sono definite in cryptxml.h. Per informazioni sui valori validi del metodo digest, vedere IXpsSigningOptions::SetDigestMethod.
  5. Caricare il certificato come descritto in Caricare un certificato da un file.
  6. Verificare che il certificato supporti il metodo di firma, come descritto in Verificare che un certificato supporti un metodo di firma.
  7. Verificare che il metodo digest sia supportato dal sistema, come descritto in Verificare che il sistema supporti un metodo digest.
  8. Se necessario, incorporare i certificati della catena di attendibilità dei certificati nel documento XPS come descritto in Incorporare catene di certificati in un documento.
  9. Firmare il documento XPS.

Nell'esempio di codice seguente viene illustrato come usare i passaggi precedenti in un programma.

    // this example requires:
    //        cryptxml.h
    // and refers to local methods that are described
    // in other topics

    HRESULT                hr               = S_OK;
    BOOL                   supported        = FALSE;
    BOOL                   succeeded        = FALSE;
    IXpsSigningOptions     *signingOptions  = NULL;
    IXpsSignature          *signature       = NULL;
    PCCERT_CONTEXT         certificate      = NULL;
    
    // Instantiate an IXpsSigningOptions interface.
    hr = signatureManager->CreateSigningOptions (&signingOptions);
    
    if (SUCCEEDED(hr)) {
        // Set the signing policy to indicate the document parts 
        //  to sign.
        hr = signingOptions->SetPolicy (XPS_SIGN_POLICY_CORE_PROPERTIES);
    }

    if (SUCCEEDED(hr)) {
        // Set the digital signature method to use to generate the 
        //    signature hash value. 
        //
        // The signature method used in this example is 
        //    defined in cryptxml.h.
        hr = signingOptions->SetSignatureMethod (
            wszURI_XMLNS_DIGSIG_RSA_SHA1);
    }

    if (SUCCEEDED(hr)) {
        // Set the digest method to use.
        //
        // The digest method used in this example is 
        //    defined in cryptxml.h.
        hr = signingOptions->SetDigestMethod (wszURI_XMLNS_DIGSIG_SHA1);
    }

    if (SUCCEEDED(hr)) {
        // Load a certificate from a certificate file
        hr = LoadCertificateFromFile (signingCertificate, &certificate);
    }

    if (SUCCEEDED(hr)) {
        // Verify the certificate supports the digest method
        supported = SupportsDigestAlgorithm (
            wszURI_XMLNS_DIGSIG_SHA1);
        if (!supported) hr = E_FAIL;
    }

    if (SUCCEEDED(hr)) {
        // Verify the signature method is supported by the certificate
        //  and the system
        supported = SupportsSignatureAlgorithm(
            wszURI_XMLNS_DIGSIG_RSA_SHA1, certificate);
        if (!supported) hr = E_FAIL;
    }

    if (SUCCEEDED(hr)) {
        // Embed the certificate trust chain in the XPS package (optional).
        hr = EmbedCertificateChainInXpsPackage (signingOptions, certificate);
    }

    if (SUCCEEDED(hr)) {
        // Sign the XPS document
        hr = signatureManager->Sign (signingOptions, certificate, &signature);
    }

 //<Free the certificate context
    if (NULL != certificate) CertFreeCertificateContext (certificate);

    if (NULL != signingOptions) signingOptions->Release();
    if (NULL != signature) signature->Release();

Passaggi successivi

Aggiungere una richiesta di firma a un documento XPS

Verificare le firme dei documenti

Usato in questa sezione

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Ulteriori informazioni

API di crittografia

Funzioni di crittografia

Caricare un certificato da un file

Verificare che un certificato supporti un metodo signature

Verificare che il sistema supporti un metodo Digest

Incorporare catene di certificati in un documento

Errori dell'API di firma digitale XPS

Errori del documento XPS

Specifica di carta XML