Ошибка при подписи

Здравствуйте, нашел похожую тему, но ответ не помог. Ошибка при подписывании документа/файла с Base64: ISSUES_CERT_NOT_FOUND. Установил боевые, корневые, тестовые сертификаты, ошибка не проходит. С Signxml проблем нет, единственное когда в теге XML встречается двоеточие он выдает ошибку и не подписывает текст XML
И второй момент, как определить что пользователь выбрал именно AUTH а не другой ключ(например для подписи) при авторизации. Сейчас на нашем ИС аутентификация возможна и с AUTH и с RSA, хотелось бы исправить
Тестирую весь функционал на вашем примере в NCALayer/index.html

Касательно ISSUES_CERT_NOT_FOUND в методах создания CMS подписи модуля Common Bundle принимаются только боевые ключи. Скорее всего вы подписываете тестовыми ключами.

Разницу между ключами аутентификации и подписи можно определить по значениям расширений сертификата. Расширение “Использование ключа” для аутентификации имеет значение “Цифровая подпись, Шифрование ключей”, а для подписи “Цифровая подпись, Неотрекаемость”. Также в методах подписи модуля Common Bundle ключи можно отфильтровать при вызове методов подписи указав значения параметра keyType “AUTHENTICATION” или “SIGNATURE”.

createCAdESFromFile(selectedStorage, “SIGNATURE”, filePath, flag, “createCAdESFromFileBack”);

Добрый день, с проблемами описанными выше я уже разобрался. Теперь вопрос такой:
как сверить AUTH и RSA. При подписи используется метод signXml, но при его вызове данные о ключе для подписи не возвращаются. То есть ситуация такая, пользователь входит с помощью AUTH, но может подписать с RSA другого пользователя

Здравствуйте. Вы можете сверить данные после подписи, из подписи можно извлечь сертификат и сравнить данные.

Вы имеете ввиду ds:X509Certificate в подписанном XML? С каким именно полем в AUTH он будет совпадать? Сертификат в формате PEM?

Я имею в виду сертификат, который содержится в xml подписи (ds:X509Certificate). Вам просто нужно сравнить данные этого сертификата с данными сертификата, через который пользователь авторизировался.

они не совпадают, в данный момент проверяю и совпадают только первые 8 символов:MIIG…

MIIG? При сравнении сертификатов имеется в виду принадлежность (ИИН, имя и т.д.).

Имелось ввиду MIIG это начало сертификата в ds:X509Certificate в XML. При подписи, XML возвращается c данными о сертификате PEM а не с ИИН, имя и т.д. Чтобы получить данные от ключа для подписи работает только метод getkeyinfo?

Сертификат в формате PEM вам нужно будет парсить и дальше работать с этими данными. Эти действия следует выполнять на стороне сервера, уже без участия NCALayer.

Доброго времени суток, сравниваю данные сертификатов подписи и авторизации и нашел пару схожестей, через определенное количество символов строки одинаковые, отсюда вопросы:
1)как из ряда этих символов получить данные о ключе для ПОДПИСИ
2)какой разделитель в сертификате PEM ‘/’ или ‘+’, для парсинга этого сертификата
3)в правильном ли я направлении я иду?

При сравнении данных имелось в виду подвтерждение пренадлежности сертификатов одному и тому же лицу, как вы изначали сказали. То есть это одинковый ИИН, либо БИН, одниковое имя и т.д. Сравнивать отрывки символов в PEM не имеет смысла.

Для выполнения данных процессов на стороне сервера можно использовать наши библиотеки на C, которые есть в нашем SDK вместе с примерами. Также есть библиотеки на Java, в частности вспомогательная библиотека knca_provider_util с некоторыми готовыми методами для работы с CMS и XML подписями и прочими процедурами, более подробно описано в документации.

Здравствуйте, в методе getKeyInfo можно указать keyType? Если нельзя как авторизоваться именно ключем AUTH. Выше вы говорили о расширении “Использование ключа”, как его получить?

Здравствуйте. Посмотрите пример в \SDK 2.0\NCALayer\commonbundle_sample. В методе getKeyInfo указывается только один параметр - тип хранилища (PKCS12, Kaztoken и т.д.):

var getKeyInfo = {
“module”: “kz.gov.pki.knca.commonUtils”,
“method”: “getKeyInfo”,
“args”: [storageName]
};

Для фильтрации ключей подписи и ключей аутентификации можно указать keyType в методах подписи как я уже писал выше.

Касательно извлчения данных из сертификата посмотрите документацию Java класса X509Certificate, для извлечения Key Usage есть метод getKeyUsage: https://docs.oracle.com/javase/8/docs/api/java/security/cert/X509Certificate.html#getKeyUsage--

Не стоит использовать getKeyInfo для аутентификации, так как это не будет аутентификацией. Об этом писал Владимир Туреханов: https://ct.kz/hall-of-fame-eds/vmpgovkz/

Добрый день,то есть вы хотите сказать, что для аутентификации надо обязательно использовать библиотеку KalkanCrypt?

Я говорю о том, что невозможно выполнить аутентификацию исключительно на стороне клиента и передать результат серверу, так как Вы не можете доверять клиенту - Вы не знаете какое ПО у него установлено и что там не сидит хакер, которые шлет Вам специально подготовленные данные.

Аутентификация должна происходить на бекенде. Если Вы хотите упростить себе жизнь, можете бесплатно пользоваться API сервисом SIGEX: https://sigex.kz/blog/authentication/