chilkat - непредвиденная ошибка при создании CAdES-BES .p7m с использованием смарт-карты

Я пытаюсь создать.p7m файл цифровой подписи CAdES-BES). Мой алгоритм основан на примере C++ chilkat: https://www.example-code.com/cpp/cades_bes_smartcard.asp

Вот мой сценарий: - Visual Studio 2008 C++ - Считыватель смарт-карт: Gemalto - Чип смарт-карты: INCARD - Универсальное промежуточное ПО Bit4id

Вот мой тест-функция:

int PSignFile(LPCSTR szFile, LPCSTR szCCN)
{
    int nReturn = 0;
    CString sError;

    try
    {
        CkGlobal glob;
        bool success = glob.UnlockBundle(GetChilkatLicence());
        if (success != true)
        {
            sError.Format("Chilkat - component unlock failed\n\n%s", glob.lastErrorText());
            throw -1;
        }

        CkCrypt2 crypt;

        //  Use a certificate on a smartcard or USB token.
        CkCert cert;
        //  Pass the certificate's Subject CN to the LoadByCommonName method.
        success = cert.LoadByCommonName(szCCN);
        if (success != true)
        {
            sError.Format("Chilkat - load certificate failed\n\n%s", cert.lastErrorText());
            throw -2;
        }

        //  Provide the smartcard PIN.
        //  If the PIN is not explicitly provided here, the Windows OS should
        //  display a dialog for the PIN.
        //cert.put_SmartCardPin("000000");

        //  Provide the certificate for signing.
        success = crypt.SetSigningCert(cert);
        if (success != true)
        {
            //std::cout << crypt.lastErrorText() << "\r\n";
            sError.Format("Chilkat - set signing certificate failed\n\n%s", crypt.lastErrorText());
            throw -3;
        }

        crypt.put_CadesEnabled(true);
        //  Indicate that SHA-256 should be used.
        crypt.put_HashAlgorithm("sha256");

        // AGGIORNARE LA VERSIONE
        //  Specify the signed attributes to be included.
        //  (This is what makes it CAdES-BES compliant.)
        CkJsonObject jsonSignedAttrs;
        jsonSignedAttrs.UpdateInt("contentType",1);
        jsonSignedAttrs.UpdateInt("signingTime",1);
        jsonSignedAttrs.UpdateInt("messageDigest",1);
        jsonSignedAttrs.UpdateInt("signingCertificateV2",1);
        crypt.put_SigningAttributes(jsonSignedAttrs.emit());

        CString sSignedFile(szFile);
        sSignedFile += ".p7m";

        //  Create the CAdES-BES signature, which contains the original data.
        success = crypt.CreateP7M(szFile, static_cast<LPCSTR>(sSignedFile));
        if (success == false)
        {
            sError.Format("Chilkat - create p7m failed\n\n%s", crypt.lastErrorText());
            throw -4;
        }
    }
    catch(int nError)
    {
        nReturn = nError;
        DisplayMessage(sError, "Errore firma");
    }

    return nReturn;
}

Я получаю это сообщение об ошибке:

ChilkatLog:
  CreateP7M:
    DllDate: Aug 25 2018
    ChilkatVersion: 9.5.0.75
    UnlockPrefix: ABCSLT.CB1092019
    Architecture: Little Endian; 32-bit
    Language: Visual C++ 9.0 (32-bit)
    VerboseLogging: 0
    Component successfully unlocked using purchased unlock code.
    inPath: D:\xml\IT00484960588_BDQMJ.xml
    outPath: D:\xml\IT00484960588_BDQMJ.xml.p7m
    createOpaqueSignature:
      createPkcs7Signature:
        hashAlgorithm: sha256
        isDetachedSignature: 0
        dataContentSize: 99270
        numSigningCerts: 1
        issuerSerialNum: 351AE9
        createAuthenticatedAttributes:
          signingCertificateV2:
            adding SigningCertificateV2 authenticated attribute...
          --signingCertificateV2
        --createAuthenticatedAttributes
        numAsnBytesToSign: 51
        msCngSignWithCert:
          msPadAndSignHashV2:
            WindowsError: Errore imprevisto di scheda. <--- ERROR !!!!
            WindowsErrorCode: 0x8010001f
          --msPadAndSignHashV2
        --msCngSignWithCert
        Failed to sign digest of authenticated attributes.
        Failed to create one or more SignerInfos...
      --createPkcs7Signature
    --createOpaqueSignature
    Failed.
  --CreateP7M
--ChilkatLog

"WindowsError: Errore imprevisto di scheda". означает "WindowsError: произошла непредвиденная ошибка карты". Я застрял на этом! Я не знаю, как дальше. Может кто-нибудь мне помочь? Спасибо!

Paolo

1 ответ

Из содержимого LastErrorText я вижу, что вы используете MSVC++ 2008 (VC9).

Пожалуйста, попробуйте эту новую сборку:

32-разрядная версия: https://chilkatdownload.com/prerelease/chilkat-9.5.0-x86-vc9-1061.zip

64-разрядная версия: https://chilkatdownload.com/prerelease/chilkat-9.5.0-x86_64-vc9-1062.zip

С августа 2018 года произошли улучшения, связанные со смарт-картами.

Примечание: Chilkat использует для подписи API-интерфейс Microsof t CNG (Cryptographic Next Generation). Если проблема остается, возможно, сертификат должен быть правильно установлен в вашей системе Windows. Проверьте документацию, предоставленную поставщиком смарт-карт ( Gemalto - чип для смарт-карт: INCARD - Bit4id Universal Middleware) или информацию о том, что нужно сделать...

Другие вопросы по тегам