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:
- Instancie uma interface IXpsSigningOptions.
- Defina a política de assinatura.
- 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.
- 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.
- Carregue o certificado conforme descrito em Carregar um certificado de um arquivo.
- 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.
- 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.
- 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.
- 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();
Tópicos relacionados
-
Próximas Etapas
-
Usado nesta seção
-
Para obter mais informações
-
Verificar se um certificado dá suporte a um método de assinatura