Partager via


Signer un document

Cette rubrique décrit comment signer un document XPS.

Avant d’utiliser les exemples de code suivants dans votre programme, lisez l’exclusion de responsabilité dans Tâches courantes de programmation de signature numérique.

Pour signer un document XPS, chargez-le d’abord dans un gestionnaire de signatures, comme décrit dans Initialiser le gestionnaire de signatures.

Pour signer un document chargé dans un gestionnaire de signatures :

  1. Instanciez une interface IXpsSigningOptions.
  2. Définissez la stratégie de signature.
  3. Définissez la méthode de signature. Les constantes de chaînes d’URI de méthode de signature sont définies dans cryptxml.h. Pour plus d’informations sur les valeurs de méthode de signature valides, consultez IXpsSigningOptions::SetSignatureMethod.
  4. Définissez la méthode digest. Les constantes de chaînes d’URI de méthode digest sont définies dans cryptxml.h. Pour plus d’informations sur les valeurs de méthode digest valides, consultez IXpsSigningOptions::SetDigestMethod.
  5. Chargez le certificat, comme décrit dans Charger un certificat à partir d’un fichier.
  6. Vérifiez que le certificat prend en charge la méthode de signature, comme décrit dans Vérifier qu’un certificat prend en charge une méthode de signature.
  7. Vérifiez que la méthode digest est prise en charge par le système, comme décrit dans Vérifier que le système prend en charge une méthode digest.
  8. Si nécessaire, incorporez les certificats de la chaîne d’approbation dans le document XPS, comme décrit dans Incorporer des chaînes de certificats dans un document.
  9. Signez le document XPS.

L’exemple de code suivant montre comment utiliser les étapes précédentes dans un programme.

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

Étapes suivantes

Ajouter une demande de signature à un document XPS

Vérifier les signatures du document

Utilisé dans cette section

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Pour plus d'informations

API Chiffrement

Fonctions de chiffrement

Charger un certificat à partir d’un fichier

Vérifier qu’un certificat prend en charge une méthode de signature

Vérifier que le système prend en charge une méthode digest

Incorporer des chaînes de certificats dans un document

Erreurs de l’API Signature numérique XPS

Erreurs de document XPS

XML Paper Specification