Firmare un documento
In questo argomento viene descritto come firmare un documento XPS.
Prima di usare gli esempi di codice seguenti nel programma, leggere la dichiarazione di non responsabilità in Common Digital Signature Programming Tasks (Attività comuni di programmazione delle firme digitali).
Per firmare un documento XPS, caricarlo prima in un gestore delle firme, come descritto in Inizializzare Gestione firme.
Per firmare un documento caricato in un gestore delle firme:
- Creare un'istanza di un'interfaccia IXpsSigningOptions .
- Impostare i criteri di firma.
- Impostare il metodo di firma. Le costanti stringa URI del metodo di firma sono definite in cryptxml.h. Per altre informazioni sui valori validi del metodo di firma, vedere IXpsSigningOptions::SetSignatureMethod.
- Impostare il metodo digest. Le costanti stringa URI del metodo digest sono definite in cryptxml.h. Per informazioni sui valori validi del metodo digest, vedere IXpsSigningOptions::SetDigestMethod.
- Caricare il certificato come descritto in Caricare un certificato da un file.
- Verificare che il certificato supporti il metodo di firma, come descritto in Verificare che un certificato supporti un metodo di firma.
- Verificare che il metodo digest sia supportato dal sistema, come descritto in Verificare che il sistema supporti un metodo digest.
- Se necessario, incorporare i certificati della catena di attendibilità dei certificati nel documento XPS come descritto in Incorporare catene di certificati in un documento.
- Firmare il documento XPS.
Nell'esempio di codice seguente viene illustrato come usare i passaggi precedenti in un programma.
// 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();
Argomenti correlati
-
Passaggi successivi
-
Usato in questa sezione
-
Ulteriori informazioni