Ключи GOST и AUTH

Добрый день,
Не нашел в темах информацию по поводу ключей, вижу что бывают AUTH_RSA и GOSTKNCA, подскажите в каком направлении двигаться?
Насколько я понял, ключ AUTH используется для проверки самого ключа на актуальность(срок действия и отозванность) и для получения информации о держателе подписи.
Само действие подписи выполняется (по опыту егов) с помощью сертификата GOSTKNCA, пытаясь подписать, хотел проверить на актуальность для этого сначала нужно получить указатель на начало сертификата($outCert), с помощью метода KalkanCrypt_X509ExportCertificateFromStore(), но выдается ошибка KCR_CERTNOTFOUND 0x08F0001b Не найден сертификат пользователя, использую ключ AUTH ошибок не возникает, выдает сам сертификат.
Вопрос правильная ли логика использования ключей AUTH_RSA и GOSTKNCA?
Подскажите есть ли тема форума в которой уже описано использование ключей и порядок подписания и проверки документов?
Надеюсь на развернутый ответ, спасибо!

Добрый день,

Для ЭЦП следует использовать исключительно ключи ЭЦП, это те, которые не AUTH, об этом написано в Приказе Министра по инвестициям и развитию Республики Казахстан “Об утверждении Правил проверки подлинности электронной цифровой подписи”. Обратите внимание на " Проверка области использования ЭЦП регистрационного свидетельства" и " Проверка номера политики регистрационного свидетельства и разрешенных способах его использования".

Анализ приказа приведен в статье https://sigex.kz/blog/signature-verification/

Ключи аутентификации разумно использовать для аутентификации в информационных системах, пример в статье: https://sigex.kz/blog/authentication/

В таком случае вопрос почему вылетает ошибка( KCR_CERTNOTFOUND 0x08F0001b Не найден сертификат пользователя) при попытке Экспорта сертификата GOSTKNCA из хранилища? Но AUTH отрабатывает нормально?

Опыта работы с PHP библиотекой не имею, но смею предположить что проблема в том, какие значения вы передаете в CHAR alias и INT flag, они могут отличаться для разных типов сертификатов.

Алиас получил с помощью \commonbundle_sample, флаг по дефолту стоял 0, из файла kalkanFlags&constants.php использовал флаг $KC_CERT_USER, ситуация не изменилась…

Между прочим, судя по Вашему вопросу, Вы подписываете данные на стороне сервера, а это похоже на передачу закрытых ключей.

Имейте в виду что передавать закрытые ключи запрещено в соответствии с пунктом 2, статьи 10, главы 3 “Закона об ЭЦП”:

Закрытые ключи электронной цифровой подписи не могут быть переданы другим лицам.

Об этом даже новость на https://pki.gov.kz/news/ есть:

Казахстанцам грозит штраф в размере 400 тысяч тенге за незаконную передачу ЭЦП третьим лицам. Об этом предупредили в Министерстве цифрового развития, инноваций и аэрокосмической промышленности, передает Tengrinews.kz со ссылкой на Almaty.tv.

Подскажите каким образом нужно подписывать документы автоматом на сервере при распечатке, не храня сертификат на том же самом сервере? кто то должен с помощью NCA Layera сидеть вводить пароли для подписания?
Мне необходимо реализовать подписание справок, которые выдались бы в личном кабинете клиенту.

Алиас получил с помощью \commonbundle_sample, флаг по дефолту стоял 0, из файла kalkanFlags&constants.php использовал флаг $KC_CERT_USER, ситуация не изменилась…

Боюсь что не смогу помочь, как уже писал, опыта работы с PHP библиотекой не имею, вероятно сотрудники НИТ смогут помочь.

Мне необходимо реализовать подписание справок, которые выдались бы в личном кабинете клиенту.

ЭЦП - это аналог собственноручной подписи. В том случае, если Вы в вашей системе реализуете автоматическое подписание справок закрытым ключей какого-то сотрудника организации, то с юридической точки зрения это будет то же самое, если бы он не глядя подписывал все справки собственноручной подписью. Так как справки выдаются, обычно, не просто так, то может возникнуть такая ситуация, что справка будет предоставлена в суде как материал дела. Так как справка подписана ЭЦП с использованием сертификата определенного субъекта (того самого сотрудника), то за достоверность данных в этой справке отвечает именно этот субъект - ведь с юридической точки зрения никакая система ответственности нести не может, ответственность несут физические и юридические лица.

Так что если Вы хотите чтобы выдаваемые справки были подписаны ключем ЭЦП какого-то сотрудника, то этот сотрудник должен иметь возможность ознакомиться с тем, что именно он подписывает и подписать справку самостоятельно.

Иначе ни о какой юридической значимости ЭЦП и речи не могло бы идти.

Информационная система может подписывать документы только “технической” подписью (не обладающей юридической значимостью) - с использованием сертификатов, не связанных с физическими или юридическими лицами.

Добрый день!
Дело в том, что не подгрузились библиотеки OpenSSL(именно kncagost.so). Сейчас у вас подключается к нативному OpenSSL(т.е. работает RSA, а вот с GOST возникает ошибка). Как настроить правильную работу библиотеки kalkancrypt.so с примером test.php описано в \C\Linux\PHP\ReadMe.txt. Затем уже можете настраивать свою систему, подобно работе примера.

Если у вас подпись будут осуществлять пользователи, то Вам необходимо это делать с помощью NCALayer (пример работы с NCALayer: SDK\NCALayer\commonbundle_sample\index.html). Т.е. сотрудник выбирает pdf-документ, выбирает ключ, вводит пароль и формируется подпись.

Почитайте данный документ - https://pki.gov.kz/docs/npa/CERTIFICATION%20PRACTICE_STATEMENT_v3.pdf - это правила применения.
Правила проверки подписи - http://adilet.zan.kz/rus/docs/V1500012864

Если столкнетесь с трудностями реализации, можете вновь написать на форум или на почту knca@pki.gov.kz.

т.е. в целом возможно и законно ведь использовать выдачу справок в личном кабинете подписывая автоматом?

Автоматом подписывать все равно нельзя.
Возьмем пример с egov. Пользователь авторизуется ключом AUTH. Затем ключом RSA/GOST подписывает запрос на выдачу справки, а не саму справку. Т.е. пользователь автоматом ничего не подписывает, а подписывает конкретное действие.
Но все равно нужен NCALayer.
Выше пользователь vsenko хорошо описал момент, почему нельзя передавать ключи на сервер - Ключи GOST и AUTH

т.е. сама справка с егов, не подписана поставщиком услуги, а лишь подписан запрос пользователем на выдачу? Т.е. допустим колледж выдает справки об обучении, обычно они подписываются условно канцелярией о том, что этот студент действительно учится в колледже, теперь в ИС он заказывает справку подтверждает действие и распечатывает справку, Справка колледжем не подписывается, как и на егов?
Суть подписи ответственного лица в справке, разве не является подтверждением данных в самой справке?

libkncagost.so такая библиотека подгружена, используем ваш сдк на php, ошибка такая же

Вы все верно говорите. Поставщик услуг подписывает справку.
Я имел ввиду, что справка не содержит подписи клиента.
Сервер же на своей стороне формирует документ и подписывает его своим ключом

Т.е. для реализации подписи на сервере нужно использовать ключ ЮР лица? или конкретного ответственного лица? Но как быть насчет хранения ключа физ лица на сервере? или для этого есть какой то другой механизм использования?
Поясните пожалуйста как реализовать автоматическое подписание на стороне сервера для выдачи справок и нужно ли хранить сам ключа на сервере? надеюсь на развернутый ответ, спасибо!

Попробуйте запустить пример в командной строке:

  1. Откройте файл test.php;
  2. Измените значение $container и $password;
  3. В командной строке выполните 2 команды:
  • export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/kalkancrypt/:/opt/kalkancrypt/lib/engines ;
  • php test.php.

В test.php осуществите вывод ошибки в 18 строчке.
$err = KalkanCrypt_LoadKeyStore($storage, $password,$container,$alias);
if ($err > 0){
echo “Error: “.$err.”\n”;
}

Если в данном примере Вы не сможете работать с Gost ключом, то значит библиотеки из /opt/kalkancrypt/ не подгружаются.

Т.е. если Gost не работает, а работает RSA - то значит наши библиотеки не подгрузились, а подгрузилась нативная OpenSSL.

Могли бы вы ответить по этому вопросу?

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

image_2021-03-26_10-38-53

Проверьте права на GOST-ключ. Еще правильно ли прописан путь до ключа GOST

Если при запуске теста в командной строке ошибка повторится, то все дело в самом ключе.

Передал весь список вопросов сотруднику. Он или Я позже ответит