XAdES-T: стандартный способ подписания через NCALayer и проверки через KalkanCrypt PHP

Здравствуйте!

Разрабатываем веб-систему, в которой пользователи подписывают документы ключом ГОСТ 2015 через NCALayer, а сервер проверяет подписи через KalkanCrypt PHP (Linux). Нам нужна XML-подпись с меткой времени (XAdES-T). Подскажите, пожалуйста, есть ли стандартный способ это сделать.

Окружение:

  • NCALayer 1.4.0 (Linux), модули: knca_applet 0.4.13, NCALayerServices 0.8.3, knca_provider_util 0.9.2, kalkancrypt_xmldsig 0.5.2;
  • KalkanCrypt C/PHP из SDK 2.0: libkalkancryptwr-64.so 2.0.13 и 2.0.14, модуль PHP 8.2 NTS.

Что получилось при подписании через NCALayer:

  1. kz.gov.pki.knca.basics, метод sign с format: “xml” и signingParams.tsaProfile: {}: подпись XMLDSig, метки времени нет.
  2. kz.gov.pki.knca.commonUtils, метод signXml: подпись XMLDSig без метки.
  3. Для format: “cms” с tsaProfile: {} метка добавляется (CAdES-T), это у нас работает.
  4. Окно «Подпись AdES» (kz.gov.pki.ncalayerservices.accessory, метод showAdesSigning) создаёт XAdES-T, но только как файл на диске пользователя, и вызвать его из веб-страницы с передачей данных нельзя.

Что получилось при проверке через KalkanCrypt PHP (KalkanCrypt_VerifyXML):

  1. Версия 2.0.13: процесс PHP завершается аварийно (SIGSEGV), когда проверяет любую подпись XAdES-T. То же происходит при подписании через KalkanCrypt_SignXML с флагом KC_WITH_TIMESTAMP.
  2. Версия 2.0.14: XAdES-T, созданная самим Kalkan (SignXML + KC_WITH_TIMESTAMP), проверяется успешно («XAdES-T: verify TSA token - OK»).
  3. Версия 2.0.14: XAdES-T, созданная окном «Подпись AdES» в NCALayer 1.4, не проходит проверку: ERROR 0x8f00054: XMLSec verify xml - failed to verify TimeStamp Hash. При сравнении увидели, что в
    xades:SigningCertificateV2/xades:CertDigest:
    • NCALayer записывает хеш ГОСТ 34.11-2015 (512 бит, 64 байта);
    • Kalkan записывает 32-байтовое значение, которое совпадает с SHA-256 сертификата, хотя DigestMethod указан gostr34112015-512.
  4. Версия 2.0.14: если в подписи XAdES нет xades:UnsignedProperties, VerifyXML тоже завершается аварийно (SIGSEGV).

Вопросы:

  1. Есть ли стандартный способ получить XAdES-T от пользователя через NCALayer из веб-страницы, то есть метод модуля basics или commonUtils с меткой времени для XML?
  2. Какой способ проверки XAdES-T на сервере рекомендован для KalkanCrypt PHP? Должен ли KalkanCrypt_VerifyXML проверять XAdES-T, созданную NCALayer 1.4 («Подпись AdES»)?

Заранее спасибо!

Добрый день! Насчет краха PHP, можете, пожалуйста, скиунть примеры на почту knca@pki.gov.kz