Assinar um documento

Este tópico descreve como assinar um documento XPS.

Antes de utilizar os seguintes exemplos de código no seu programa, leia a declaração de exoneração de responsabilidade em Common Digital Signature Programming Tasks.

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 IXpsSigningOptions interface.
  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 de método de assinatura válidos, consulte IXpsSigningOptions::SetSignatureMethod.
  4. Defina o método de digestão. 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 suporta o método de assinatura, conforme descrito em Verificar se um certificado suporta um método de assinatura.
  7. Verifique se o método digest é suportado pelo sistema, conforme descrito em Verificar se o Sistema Suporta um Método Digest.
  8. Se necessário, incorpore os certificados da cadeia de confiança de certificados no documento XPS, conforme descrito em Incorporar 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óximos passos

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

Verificar assinaturas de documentos

utilizados nesta secção

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Assinar

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Para mais informações

API de criptografia

Funções de criptografia

carregar um certificado de um arquivo

verificar se um certificado suporta um método de assinatura

Verificar se o sistema suporta um método Digest

incorporar cadeias de certificados em um documento

Erros de API de assinatura digital XPS

Erros de documento XPS

Especificação de Papel XML