Firmar un documento
En este tema se describe cómo firmar un documento XPS.
Antes de utilizar los siguientes ejemplos de código en su programa, lea la cláusula de exención de responsabilidad en Tareas comunes de programación de firmas digitales.
Para firmar un documento XPS, primero cárguelo en un administrador de firmas como se describe en Inicializar el administrador de firmas.
Para firmar un documento que se ha cargado en un administrador de firmas:
- Crear una instancia de una interfaz IXpsSigningOptions.
- Establecer la directiva de firma.
- Establecer el método de firma. Las constantes de cadena del método de firma URI se definen en cryptxml.h. Para obtener más información sobre los valores de método de firma válidos, vea IXpsSigningOptions::SetSignatureMethod.
- Establecer el método de resumen. Las constantes de cadena de URI del método de resumen se definen en cryptxml.h. Para obtener información sobre los valores de método de resumen válidos, vea IXpsSigningOptions::SetDigestMethod.
- Cargar el certificado como se describe en Cargar un certificado desde un archivo.
- Compruebe que el certificado admite el método de firma, como se describe en Comprobar que un certificado admite un método de firma.
- Compruebe que el sistema admite el método de resumen, como se describe en Comprobar que el sistema admite un método de resumen.
- Si es necesario, inserte los certificados de la cadena de confianza de certificados en el documento XPS, tal como se describe en Insertar cadenas de certificados en un documento.
- Firmar el documento XPS.
En el ejemplo de código siguiente se muestra cómo usar los pasos anteriores en un 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();
Temas relacionados
-
Pasos siguientes
-
Usado en esta sección
-
Para obtener más información