Compartir a través de


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:

  1. Crear una instancia de una interfaz IXpsSigningOptions.
  2. Establecer la directiva de firma.
  3. 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.
  4. 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.
  5. Cargar el certificado como se describe en Cargar un certificado desde un archivo.
  6. Compruebe que el certificado admite el método de firma, como se describe en Comprobar que un certificado admite un método de firma.
  7. Compruebe que el sistema admite el método de resumen, como se describe en Comprobar que el sistema admite un método de resumen.
  8. 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.
  9. 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();

Pasos siguientes

Agregar una solicitud de firma a un documento XPS

Comprobar firmas de documento

Usado en esta sección

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Para obtener más información

Cryptography API

Funciones de criptografía

Cargar un certificado desde un archivo

Comprobar que un certificado admite un método de firma

Comprobar que el sistema admite un método de resumen

Insertar cadenas de certificados en un documento

Errores de la API de firma digital XPS

Errores en documentos XPS

XML Paper Specification