Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
- Instancie uma IXpsSigningOptions interface.
- 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 de método de assinatura válidos, consulte IXpsSigningOptions::SetSignatureMethod.
- 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.
- Carregue o certificado conforme descrito em Carregar um certificado de um arquivo.
- Verifique se o certificado suporta o método de assinatura, conforme descrito em Verificar se um certificado suporta um método de assinatura.
- Verifique se o método digest é suportado pelo sistema, conforme descrito em Verificar se o Sistema Suporta um Método Digest.
- 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.
- 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óximos passos
-
utilizados nesta secção
-
Para mais informações