Ошибка проверки цепочки сертификатов (PHP)

Добрый день.

Столкнулся вот с какой проблемой. При проверке подписи юридического лица PHP функцией KalkanCrypt_VerifyData() возникает такая ошибка:
XMLSec Initialize - OK.
XML parse doc - OK.
XMLSec verify xml - found 1 sign(s).
ERROR 0x8f00042: Load certificate from system store - failed to load root or intermediate certificate. Unable convert to X509.
ERROR 0x8f00022: XMLSec verify xml - FAILED.
ERROR 0x8f00022: XMLSec verify xml - FAILED.

Проверка подписи физического лица проходит без ошибок. Корневые сертификаты установлены согласно инструкции SDK.

Подскажите, пожалуйста, в чем может быть проблема и где искать корень зла?

Добрый день! Вам надо установить корневые gost сертификаты. Корневые сертификаты вместе с инструкцией об установке находятся по пути SDK\Keys and Certs\CA CERTS\

В SDK\Keys and Certs\CA CERTS\ корневые сентификаты есть, но инструкции по установке там нет.
Корневые сертификаты у меня установлены. Ставил из SDK 2.0\C\Linux\ca-certs согласно иструкции, расположенной там же.
P.S. Не будь они установлены, то проверка подписи физ. лица тоже возвращала бы ошибку, но она отрабатывает нормально

Обновите SDK, по тому же пути, что вы указали - SDK 2.0\C\Linux\ca-certs - есть обновленные инструкции с сертификатами.

Спасибо, буду разбираться

Добрый день.

По Вашей рекоменации установил новый SDK на чистый Linux (Ubuntu 20.04).
В тестовм файле (NCALayer\commonbundle_sample\index.html) подписал Base64 строку подписью юр. лица. Формат подписи CMS.

При проверке подписи функцией KalkanCrypt_VerifyData() с флагом $KC_SIGN_CMS + $KC_IN_BASE64 + $KC_IN2_BASE64 + $KC_OUT_BASE64 + $KC_DETACHED_DATA в некоторых случаях возвращается результат

Signature N 1
CAdES-BES: verify signer certificate hash - OK.
Verify - OK
CMS Verify - OK

а в некоторых выдает ошибку:

ERROR 0x609e09c: Verify Data - verify error.
error:0609E09C:digital envelope routines:PKEY_SET_TYPE:unsupported algorithmCMS Verify - FAILED.

В чем может быть причина такой нестабильности исполнения функции? Подпись одна и таже, просто перезагружаю несколько раз страницу и положительный результат проверки меняется на отрицательный и наоборот. После примерно десятка перезагрузок функция начинает стабильно возвращать ошибку.

Добрый день! Какой веб сервер используете? Проверку на php делаете?

Веб сервер Apache 2.0 (без ngix). Проверка на PHP версия 7.4

Надо будет вызвать функцию KalkanCrypt_Finalize() только в самом конце работы. Либо перезагружать Apache после каждого KalkanCrypt_Finalize()

Вариант с перезагрузкой Apache после KalkanCrypt_Finalize() вообще не приемлем, т.к. это приведет к нестабильной работе системы.

Что же касается первого варианта, то не совсем понятно что значит “в самом конце работы”. В конце работы чего: метода, класса, сессии? Насколько корректно будут работать методы Kalkancrypt если вообще не финализировать работу с классом? Это правило действует только в случаях с GOST подписями, потому что с RSA подписями подобных проблем замечено не было?

Вопросов становится все больше.

На работы методов никак не повлияет, если не будете финализировать. Можно дальше продолжать успешно применять методы, без KalkanCrypt_Finalize(). Финализация нужна для того, чтобы очищать память от закрытых ключей, сертификатов и прочих значений.

Да, все верно, такое происходит только с GOST. Наши разработчики займутся данным вопросом во втором квартале следующего года.

Верно ли я понимаю, что для для разных пользователей при инициализации будут создаваться отдельные экземпляры Kalkancrypt и работа в них будет вестись с их подписями и сертификатами? Достаточно ли будет одной перезагрузки Apache в день для очистки памяти?

Не будет создаваться отдельные экземпляры

Думаю, будет достаточно

Переформулирую вопрос: смогут ли несколько пользователей портала работать со своими ЭЦП (проверять валидность подписи и сертификата, извлекать данные серттификата) без вероятности подмены их данных данными другого пользователя?

Да, сколько угодно разных подписей и сертификатов можете отправлять и успешно проверять их, без риска подмены данных. Но, закрытые ключи не стоит отправлять, так как передавать их запрещено в соответствии "законом об ЭЦП”

Про закрытые ключи я ничего не говорил, это и так понятно. Ситуация более-менее прояснилась.

Большое спасибо за пояснения и информацию

1 Симпатия