对文档签名

本主题介绍如何对 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

详细信息

加密 API

加密函数

从文件加载证书

验证证书是否支持签名方法

验证系统是否支持摘要方法

在文档中嵌入证书链

XPS 数字签名 API 错误

XPS 文档错误

XML 纸张规范