Freigeben über


Signieren eines Dokuments

In diesem Thema wird beschrieben, wie Sie ein XPS-Dokument signieren.

Bevor Sie die folgenden Codebeispiele in Ihrem Programm verwenden, lesen Sie den Haftungsausschluss in Allgemeine Aufgaben bei der Programmierung digitaler Signaturen.

Um ein XPS-Dokument zu signieren, laden Sie es zuerst in einen Signatur-Manager, wie in Signatur-Manager initialisieren beschrieben.

So signieren Sie ein Dokument, das in einen Signatur-Manager geladen wurde:

  1. Instanziieren Sie eine IXpsSigningOptions-Schnittstelle.
  2. Legen Sie die Signaturrichtlinie fest.
  3. Legen Sie die Signaturmethode fest. Signaturmethoden-URI-Zeichenfolgenkonstanten werden in cryptxml.h definiert. Weitere Informationen zu gültigen Signaturmethodenwerten finden Sie unter IXpsSigningOptions::SetSignatureMethod.
  4. Legen Sie die Digestmethode fest. URI-Zeichenfolgenkonstanten der Digestmethode werden in cryptxml.h definiert. Informationen zu gültigen Digestmethodenwerten finden Sie unter IXpsSigningOptions::SetDigestMethod.
  5. Laden Sie das Zertifikat wie unter Laden eines Zertifikats aus einer Datei beschrieben.
  6. Stellen Sie sicher, dass das Zertifikat die Signaturmethode unterstützt, wie unter Überprüfen, ob ein Zertifikat eine Signaturmethode unterstützt beschrieben.
  7. Stellen Sie sicher, dass die Digestmethode vom System unterstützt wird, wie unter Überprüfen, ob das System eine Digestmethode unterstützt beschrieben.
  8. Falls erforderlich, betten Sie die Zertifikate der Zertifikatvertrauenskette in das XPS-Dokument ein, wie unter Einbetten von Zertifikatketten in ein Dokumentbeschrieben.
  9. Signieren Sie das XPS-Dokument.

Im folgenden Codebeispiel wird veranschaulicht, wie die vorstehenden Schritte in einem Programm verwendet werden.

    // 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();

Nächste Schritte

Hinzufügen einer Signaturanforderung zu einem XPS-Dokument

Überprüfen von Dokumentsignaturen

In diesem Abschnitt verwendet

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Weitere Informationen

Kryptografie-API

Kryptografiefunktionen

Laden eines Zertifikats aus einer Datei

Überprüfen, ob ein Zertifikat eine Signaturmethode unterstützt

Überprüfen, ob das System eine Digestmethode unterstützt

Einbetten von Zertifikatketten in ein Dokument

API-Fehler bei der digitalen XPS-Signatur

XPS-Dokumentfehler

XML Paper Specification