Menandatangani Dokumen

Topik ini menjelaskan cara menandatangani dokumen XPS.

Sebelum menggunakan contoh kode berikut dalam program Anda, baca penafian di Tugas Pemrograman Tanda Tangan Digital Umum.

Untuk menandatangani dokumen XPS, muat terlebih dahulu ke manajer tanda tangan seperti yang dijelaskan dalam Menginisialisasi Signature Manager.

Untuk menandatangani dokumen yang telah dimuat ke manajer tanda tangan:

  1. Membuat instans antarmuka IXpsSigningOptions .
  2. Atur kebijakan penandatanganan.
  3. Atur metode tanda tangan. Konstanta string URI metode tanda tangan ditentukan dalam cryptxml.h. Untuk informasi selengkapnya tentang nilai metode tanda tangan yang valid, lihat IXpsSigningOptions::SetSignatureMethod.
  4. Atur metode hash. Konstanta string URI metode hash ditentukan dalam cryptxml.h. Untuk informasi tentang nilai metode hash yang valid, lihat IXpsSigningOptions::SetDigestMethod.
  5. Muat sertifikat seperti yang dijelaskan dalam Memuat Sertifikat Dari File.
  6. Verifikasi bahwa sertifikat mendukung metode tanda tangan, seperti yang dijelaskan dalam Memverifikasi Bahwa Sertifikat Mendukung Metode Tanda Tangan.
  7. Verifikasi bahwa metode hash didukung oleh sistem, seperti yang dijelaskan dalam Memverifikasi Sistem Mendukung Metode Hash.
  8. Jika diperlukan, sematkan sertifikat rantai kepercayaan sertifikat dalam dokumen XPS seperti yang dijelaskan dalam Embed Certificate Chains dalam Dokumen.
  9. Tanda tangani dokumen XPS.

Contoh kode berikut mengilustrasikan cara menggunakan langkah-langkah sebelumnya dalam program.

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

Langkah berikutnya

Menambahkan Permintaan Tanda Tangan ke Dokumen XPS

Memverifikasi Tanda Tangan Dokumen

Digunakan di Bagian Ini

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

Untuk Informasi Selengkapnya

API Kriptografi

Fungsi Kriptografi

Memuat Sertifikat Dari File

Memverifikasi Sertifikat Mendukung Metode Tanda Tangan

Memverifikasi Sistem Mendukung Metode Hash

Menyematkan Rantai Sertifikat dalam Dokumen

Kesalahan XPS Digital Signature API

Kesalahan Dokumen XPS

Spesifikasi Kertas XML