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:
- Instanziieren Sie eine IXpsSigningOptions-Schnittstelle.
- Legen Sie die Signaturrichtlinie fest.
- Legen Sie die Signaturmethode fest. Signaturmethoden-URI-Zeichenfolgenkonstanten werden in cryptxml.h definiert. Weitere Informationen zu gültigen Signaturmethodenwerten finden Sie unter IXpsSigningOptions::SetSignatureMethod.
- Legen Sie die Digestmethode fest. URI-Zeichenfolgenkonstanten der Digestmethode werden in cryptxml.h definiert. Informationen zu gültigen Digestmethodenwerten finden Sie unter IXpsSigningOptions::SetDigestMethod.
- Laden Sie das Zertifikat wie unter Laden eines Zertifikats aus einer Datei beschrieben.
- Stellen Sie sicher, dass das Zertifikat die Signaturmethode unterstützt, wie unter Überprüfen, ob ein Zertifikat eine Signaturmethode unterstützt beschrieben.
- Stellen Sie sicher, dass die Digestmethode vom System unterstützt wird, wie unter Überprüfen, ob das System eine Digestmethode unterstützt beschrieben.
- Falls erforderlich, betten Sie die Zertifikate der Zertifikatvertrauenskette in das XPS-Dokument ein, wie unter Einbetten von Zertifikatketten in ein Dokumentbeschrieben.
- 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();
Zugehörige Themen
-
Nächste Schritte
-
In diesem Abschnitt verwendet
-
Weitere Informationen
-
Überprüfen, ob ein Zertifikat eine Signaturmethode unterstützt