次の方法で共有


ドキュメントに署名する

このトピックでは、XPS ドキュメントに署名する方法について説明します。

プログラムで次のコード例を使用する前に、「一般的なデジタル署名プログラミング タスク」の免責事項をお読みください。

XPS ドキュメントに署名するには、「署名マネージャーの初期化」の説明に従って、まず署名マネージャーに読み込みます。

署名マネージャーに読み込まれたドキュメントに署名するには:

  1. IXpsSigningOptions インターフェイスをインスタンス化します。
  2. 署名ポリシーを設定します。
  3. シグネチャ メソッド設定します。 シグネチャ メソッド URI 文字列定数は cryptxml.h で定義されています。 有効なシグネチャ メソッド値の詳細については、「IXpsSigningOptions::SetSignatureMethod」を参照してください。
  4. ダイジェスト メソッドを設定します。 ダイジェスト メソッド URI 文字列定数は cryptxml.h で定義されています。 有効なダイジェスト メソッド値の詳細については、「IXpsSigningOptions::SetDigestMethod 」を参照してください。
  5. ファイルからの証明書の読み込み」の説明に従って証明書を読み込みます。
  6. 証明書が署名メソッドをサポートしていることを確認する」の説明に従って、証明書が署名メソッドをサポートしていることを確認します。
  7. システムがダイジェスト メソッドをサポートしていることを確認する」の説明に従って、ダイジェスト メソッドがシステムでサポートされていることを確認します。
  8. 必要に応じて、「ドキュメントに証明書チェーンを埋め込む」の説明に従って、XPS ドキュメントに 証明書信頼チェーンの証明書を埋め込みます。
  9. XPS ドキュメントに署名します。

次のコード例は、プログラムで上記の手順を使用する方法を示しています。

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

次のステップ

XPS ドキュメントに署名要求を追加する

ドキュメント署名の確認

このセクションで使用

CertFreeCertificateContext

IXpsSignatureManager

IXpsSignatureManager::CreateSigningOptions

IXpsSignatureManager::Sign

IXpsSigningOptions

IXpsSigningOptions::SetDigestMethod

IXpsSigningOptions::SetPolicy

IXpsSigningOptions::SetSignatureMethod

XPS_SIGN_POLICY

詳細情報

Cryptography API

暗号化関数

ファイルから証明書を読み込む

証明書が署名メソッドをサポートしていることを確認する

システムでダイジェスト メソッドがサポートされていることを確認する

ドキュメントに証明書チェーンを埋め込む

XPS デジタル署名 API のエラー

XPS ドキュメントのエラー

XML Paper Specification