对文档签名
本主题介绍如何对 XPS 文档签名。
在程序中使用以下代码示例之前,请阅读常见数字签名编程任务中的免责声明。
要对 XPS 文档签名,请先将其加载到签名管理器中,如初始化签名管理器中所述。
要对已加载到签名管理器的文档进行签名:
- 实例化 IXpsSigningOptions 接口。
- 设置签名策略。
- 设置签名方法。 签名方法 URI 字符串常量在 cryptxml.h 中定义。 有关有效签名方法值的详细信息,请参阅 IXpsSigningOptions::SetSignatureMethod。
- 设置摘要方法。 摘要方法 URI 字符串常量在 cryptxml.h 中定义。 有关有效摘要方法值的信息,请参阅 IXpsSigningOptions::SetDigestMethod。
- 加载证书,如从文件加载证书中所述。
- 验证证书是否支持签名方法,如验证证书是否支持签名方法中所述。
- 验证系统是否支持摘要方法,如验证系统是否支持摘要方法中所述。
- 如果需要,在 XPS 文档中嵌入证书信任链的证书,如在文档中嵌入证书链中所述。
- 对 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();
相关主题
-
后续步骤
-
本部分使用的内容
-
详细信息