Compartilhar via


Assinar um documento

Este tópico descreve como assinar um documento XPS.

Antes de usar os exemplos de código a seguir em seu programa, leia o aviso de isenção de responsabilidade em Tarefas comuns de programação de assinatura digital.

Para assinar um documento XPS, primeiro carregue-o em um gerenciador de assinaturas, conforme descrito em Inicializar o Gerenciador de assinaturas.

Para assinar um documento que foi carregado em um gerenciador de assinaturas:

  1. Instancie uma interface IXpsSigningOptions.
  2. Defina a política de assinatura.
  3. Defina o método de assinatura. As constantes de cadeia de caracteres URI do método de assinatura são definidas em cryptxml.h. Para obter mais informações sobre valores válidos do método de assinatura, consulte IXpsSigningOptions::SetSignatureMethod.
  4. Defina o método digest. As constantes de cadeia de caracteres URI do método Digest são definidas em cryptxml.h. Para obter informações sobre valores válidos do método digest, consulte IXpsSigningOptions::SetDigestMethod.
  5. Carregue o certificado conforme descrito em Carregar um certificado de um arquivo.
  6. Verifique se o certificado dá suporte ao método de assinatura, conforme descrito em Verificar se um certificado dá suporte a um método de assinatura.
  7. Verifique se o método digest é compatível com o sistema, conforme descrito em Verificar se o sistema dá suporte a um método Digest.
  8. Se necessário, insira os certificados da cadeia de confiança do certificado no documento XPS, conforme descrito em Inserir Cadeias de Certificados em um Documento.
  9. Assine o documento XPS.

O exemplo de código a seguir ilustra como usar as etapas anteriores em um programa.

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

Próximas Etapas 

Adicionar uma solicitação de assinatura a um documento XPS

Verificar assinaturas de documento

Usado nesta seção

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Para obter mais informações

API de criptografia

Funções de criptografia

Carregar um certificado de um arquivo

Verificar se um certificado dá suporte a um método de assinatura

Verificar se o sistema dá suporte a um método Digest

Inserir cadeias de certificados em um documento

Erros de API de Assinatura Digital do XPS

Erros de documento XPS

Especificação de papel XML