cryptopro icon indicating copy to clipboard operation
cryptopro copied to clipboard

base64_encode для подписи сообщения

Open noirwave opened this issue 6 years ago • 6 comments

Добрый день. Есть несколько вопросов по реализации подписи на php.

Зачем перед подписью сообщения происходит base64_encode? После unsign необходимо дополнительно делать base64_decode. Попробовал убрать эти base64_encode - после unsign возвращается пустая строка.

Посмотрели пример на https://cpdn.cryptopro.ru/content/cades/phpcades-samples.html. Ваш способ подписи отличается от этого примера. Есть ли разница в выходной сигнатуре?

Вообще все работает отлично, но вопрос в том, подойдет ли эта сигнатура для запросов к ЕСИА.

Используем эту библиотеку для авторизации https://github.com/ekapusta/oauth2-esia. Написали Signer, который работает с апи докер контейнера с криптопро. ЕСИА возвращает ошибку авторизации и непонятно в чем дело.

noirwave avatar Nov 25 '19 10:11 noirwave

Добрый день!

Есть несколько вопросов по реализации подписи на php

С подписью документов на PHP возникла одна непреодолимая сложность, а именно я не нашел способа добавить второго подписанта (cosign). Подробнее я написал об этом тут: https://github.com/dbfun/cryptopro/issues/1#issuecomment-531151426

Зачем перед подписью сообщения происходит base64_encode? После unsign необходимо дополнительно делать base64_decode. Попробовал убрать эти base64_encode - после unsign возвращается пустая строка.

Делается это для подписания бинарных данных, предварительно устанавливается способ ввода эти данных: $sd->set_ContentEncoding(1); $sd->set_Content(base64_encode($content));, и это работает. Возможно, для теста это не нужно делать. Документации по этому поводу мало, очень многое делалось экспериментально.

Посмотрели пример на https://cpdn.cryptopro.ru/content/cades/phpcades-samples.html. Ваш способ подписи отличается от этого примера. Есть ли разница в выходной сигнатуре?

Возможно, они поменяли пример на сайте. Или я взял пример не с сайта, а из репозитория, в нем также есть примеры на PHP. Не могу точно сказать.

Вообще все работает отлично, но вопрос в том, подойдет ли эта сигнатура для запросов к ЕСИА.

Не могу сказать. Вариант, для которого используется контейнер - подписание файлов. Для HTTP запросов есть curl, пропатченный КриптоПро (он также есть в контейнере). Но я его не пробовал использовать, не было ни нужды, ни возможности.

dbfun avatar Nov 25 '19 11:11 dbfun

Или я взял пример не с сайта, а из репозитория, в нем также есть примеры на PHP

Скиньте, пожалуйста, ссылку на репозиторий

noirwave avatar Nov 25 '19 11:11 noirwave

Скиньте, пожалуйста, ссылку на репозиторий

Я брал .rpm пакет, который скачивается с сайта КриптоПро после регистрации. Из-за лицензии этот пакет нельзя куда-либо выкладывать. Содержимое можно посмотреть через rpm2cpio cprocsp-pki-2.0.0-amd64-phpcades.rpm | cpio -idmv.

dbfun avatar Nov 25 '19 11:11 dbfun

Спасибо, нашли пример из пакета и он такой же как у вас. А если использовать подписание через командную строку, например

shell_exec('/scripts/sign dd45247ab9db600dca42cc36c1141262fa60e3fe 12345678');

там я не увидел преобразования к base64 но выводит она подобную base64 строку

noirwave avatar Nov 25 '19 12:11 noirwave

но выводит она подобную base64 строку Это специфика работы программы cryptcp. Если не ошибаюсь, такое поведение нельзя переделать. Вообще, мой взгляд, там много странностей работы.

dbfun avatar Nov 25 '19 12:11 dbfun

Чтобы подписанный документ выдавался не в кодировке base64, надо указать опцию -der:

/opt/cprocsp/bin/amd64/crytpcp -der -sign dn "CN=Тест" /path/to/file /path/to/file.p7s

Типа такого.

thelv avatar Dec 06 '22 03:12 thelv