Поделиться через


Подписыв документ

В этом разделе описывается, как подписать документ XPS.

Прежде чем использовать приведенные ниже примеры кода в программе, прочтите заявление об отказе в задачах программирования Common Digital Signature.

Чтобы подписать документ 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 шифрования

Криптографические функции

Загрузка сертификата из файла

Проверка того, что сертификат поддерживает метод подписи

Проверка того, что система поддерживает дайджест-метод

Внедрение цепочек сертификатов в документ

Ошибки API цифровых подписей XPS

Ошибки документа XPS

Спецификация XML-бумаги