Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano sposób podpisywania dokumentu XPS.
Przed użyciem poniższych przykładów kodu w programie przeczytaj zastrzeżenie w Common Digital Signature Programming Tasks.
Aby podpisać dokument XPS, najpierw załaduj go do menedżera podpisów zgodnie z opisem w Inicjowanie programu Signature Manager.
Aby podpisać dokument, który został załadowany do menedżera podpisów:
- Utwórz instancję interfejsu IXpsSigningOptions.
- Ustaw zasady podpisywania.
- Ustaw metodę podpisu. Stałe ciągi znaków identyfikatora URI dla metody podpisu są definiowane w pliku cryptxml.h. Aby uzyskać więcej informacji na temat prawidłowych wartości metody podpisu, zobacz IXpsSigningOptions::SetSignatureMethod.
- Ustaw metodę skrótu. Stałe ciągów identyfikatora URI metody Digest są definiowane w pliku cryptxml.h. Aby uzyskać informacje o prawidłowych wartościach metody skrótu, zobacz IXpsSigningOptions::SetDigestMethod.
- Załaduj certyfikat zgodnie z opisem w Ładowanie certyfikatu z pliku.
- Sprawdź, czy certyfikat obsługuje metodę podpisu zgodnie z opisem w Sprawdź, czy certyfikat obsługuje metodę podpisu.
- Sprawdź, czy metoda skrótu jest obsługiwana przez system, zgodnie z opisem w Zweryfikuj, czy system obsługuje metodę skrótu.
- Jeśli to konieczne, osadź certyfikaty łańcucha certyfikatów zaufania w dokumencie XPS zgodnie z opisem w Osadzanie łańcuchów certyfikatów w dokumencie.
- Podpisz dokument XPS.
Poniższy przykład kodu ilustruje sposób użycia powyższych kroków w programie.
// 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();
Tematy pokrewne
-
następne kroki
-
używane w tej sekcji
-
aby uzyskać więcej informacji
-
błędy interfejsu API podpisu cyfrowego XPS