Signer un document
Cette rubrique décrit comment signer un document XPS.
Avant d’utiliser les exemples de code suivants dans votre programme, lisez l’exclusion de responsabilité dans Tâches courantes de programmation de signature numérique.
Pour signer un document XPS, chargez-le d’abord dans un gestionnaire de signatures, comme décrit dans Initialiser le gestionnaire de signatures.
Pour signer un document chargé dans un gestionnaire de signatures :
- Instanciez une interface IXpsSigningOptions.
- Définissez la stratégie de signature.
- Définissez la méthode de signature. Les constantes de chaînes d’URI de méthode de signature sont définies dans cryptxml.h. Pour plus d’informations sur les valeurs de méthode de signature valides, consultez IXpsSigningOptions::SetSignatureMethod.
- Définissez la méthode digest. Les constantes de chaînes d’URI de méthode digest sont définies dans cryptxml.h. Pour plus d’informations sur les valeurs de méthode digest valides, consultez IXpsSigningOptions::SetDigestMethod.
- Chargez le certificat, comme décrit dans Charger un certificat à partir d’un fichier.
- Vérifiez que le certificat prend en charge la méthode de signature, comme décrit dans Vérifier qu’un certificat prend en charge une méthode de signature.
- Vérifiez que la méthode digest est prise en charge par le système, comme décrit dans Vérifier que le système prend en charge une méthode digest.
- Si nécessaire, incorporez les certificats de la chaîne d’approbation dans le document XPS, comme décrit dans Incorporer des chaînes de certificats dans un document.
- Signez le document XPS.
L’exemple de code suivant montre comment utiliser les étapes précédentes dans un programme.
// 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();
Rubriques connexes
-
Étapes suivantes
-
Utilisé dans cette section
-
Pour plus d'informations
-
Vérifier qu’un certificat prend en charge une méthode de signature