このトピックでは、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();
関連トピック
-
次の手順
-
XPS ドキュメント に署名要求を追加する
-
このセクションで使用
-
詳細
-
ファイル から証明書を読み込む
-
システムがダイジェストメソッドをサポート を確認する
-
ドキュメント に証明書チェーンを埋め込む