Здравствуйте!
Разрабатываем веб-систему, в которой пользователи подписывают документы ключом ГОСТ 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:
- kz.gov.pki.knca.basics, метод sign с format: “xml” и signingParams.tsaProfile: {}: подпись XMLDSig, метки времени нет.
- kz.gov.pki.knca.commonUtils, метод signXml: подпись XMLDSig без метки.
- Для format: “cms” с tsaProfile: {} метка добавляется (CAdES-T), это у нас работает.
- Окно «Подпись AdES» (kz.gov.pki.ncalayerservices.accessory, метод showAdesSigning) создаёт XAdES-T, но только как файл на диске пользователя, и вызвать его из веб-страницы с передачей данных нельзя.
Что получилось при проверке через KalkanCrypt PHP (KalkanCrypt_VerifyXML):
- Версия 2.0.13: процесс PHP завершается аварийно (SIGSEGV), когда проверяет любую подпись XAdES-T. То же происходит при подписании через KalkanCrypt_SignXML с флагом KC_WITH_TIMESTAMP.
- Версия 2.0.14: XAdES-T, созданная самим Kalkan (SignXML + KC_WITH_TIMESTAMP), проверяется успешно («XAdES-T: verify TSA token - OK»).
- Версия 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.
- Версия 2.0.14: если в подписи XAdES нет xades:UnsignedProperties, VerifyXML тоже завершается аварийно (SIGSEGV).
Вопросы:
- Есть ли стандартный способ получить XAdES-T от пользователя через NCALayer из веб-страницы, то есть метод модуля basics или commonUtils с меткой времени для XML?
- Какой способ проверки XAdES-T на сервере рекомендован для KalkanCrypt PHP? Должен ли KalkanCrypt_VerifyXML проверять XAdES-T, созданную NCALayer 1.4 («Подпись AdES»)?
Заранее спасибо!