Комментарии 9
Да, документация по криптопро SDK просто великолепна, поэтому я просто написал обвязку для командной строки - вывел информацию о командах через -help, упаковал их в массив и вызываю через магический метод __call(), используя текучий интерфейс. Выглядит типа:
new CryptoProAdapter()
->signDocument()
->in() //входной файл
->out() //выходной файл
->my() //отпечаток
->base64() //если нужно закодировать
->detached() //если нужна открепленная подпись
->run()
Далее...
Электронные подписи ФНС успешно размножаются и это довольно часто практикуется, будете вы их копировать или нет - вопрос открытый. Я не уверен, можно ли прокинуть токен с подписью в docker на mac OS. Попробуйте виртуальную машину с linux поставить и там развернуть docker.
Интересный подход! А документ со smev-трансформацией таким образом тоже можно сделать?
Да, если вы добавите cli инструмент, который умеет это делать. Эта библиотека является обвязкой для работы с консольными утилитами КриптоПро. Если вы найдете SignXml утилиту, то можно добавить методы из справки в исходный массив, после этого их можно будет вызвать через текучий интерфейс.
Но я бы трезво оценивал цели и трудозатраты. Для реализации базовых функций криптопро (подписать, проверить, зашифровать) я бы выбрал cli, потому что не нужно особо заморачиваться с настройкой окружения и это будет предсказуемо работать на всех операционных системах, где установлен криптопро. Для специфических задач, возможно, будет правильнее и надежнее использовать SDK.
Хотя в одной из крупнейших фармацевтических компаний России спокойно используется криптопро через cli и php для подписания документов :D
Я нашел проект на C#, где можно реализовать СМЭВ и проверить подпись. Мы можем скомпилировать его и вызвать через PHP.
Будет выглядеть так:
new CryptoProAdapter()
->SignXmlFile()
->FileName()
->SignedFileName()
->Key()
->Certificate()
->run()
Либо можем поднять .net сервер и запрашивать подписание через curl или очереди.
Это не выглядит хорошим решением, честно говоря
Консоль? Зависит от задач. Если разрабатывать специфический проект, то да. Если нужно добавить подписание, шифрование или проверку документов в существующий проект, то вполне нормальное решение, потому что используются оригинальные инструменты, хоть и консольные.
Используя командную строку, вы запускаете официальную, скомпилированную c++ обертку для работы с КриптоПро API. Используя SDK, вы так же запускаете обертку на c++/c#, только через DLL и COM-интерфейс. Ни один из этих способов не является нативным.
Если говорить об отдельном сервисе подписания на .NET, то это нормальная практика - тем более .NET и C# имеют лучшую экосистему для работы с документами и криптографией. В прошлом году я на заказ писал аналог платной утилиты КриптоПро PDF на C# с визуализацией подписи на документе и могу с уверенностью сказать, что там это реализовано лучше, чем на PHP.
Но как я уже говорил - зависит от задач. Есть компания, которая за год 5млн документов прогоняет через консольную реализацию и все работает отлично.
Я бы просто ориентировался на требования работодателя и исходя их этого принимал решения. Комбинировать методы тоже никто не мешает.
Безусловно зависит от контекста. Если у вас есть, кроме команды php-разработчиков, еще и команда пишущая на C#, то поручить им разработку сервиса подписи будет хорошим решением. Но вот компилировать проект на C# и ставить его на убунту и использовать, вызывая как консольное приложение, это уже не выглядит решением, которое легче внедрить и поддерживать команде пишущей на php.
Минусы вижу такие
- надо разбираться как компилировать чужой проект на C#
- сложней обрабатывать ошибки
- если из коробки утилита не делает то, что вам надо (например кладет подпись не в тот тег, который требуется), вам придется разбираться в том, как ее дописать.
Плюсы объективно говоря тоже есть - не надо собирать расширение криптопро
Опытный php разработчик, знающий базовые паттерны, освоит основы C# за 5-6 часов - этого более чем достаточно, что бы вызывать методы крипто про api и скомпилировать проект. Не зная C# , я за 30 минут написал службу, которая берет лицензии крипто-про с удаленного сервера и зашивает в реестр. Работа с реестром, командной строкой, приложениями, системными api и внешними устройствами в C# просто божественна.
Обработка ошибок в C# такая же, как в php. Делаете try catch и выбрасываете либо Console.WriteLine($"[Error: 0x000000]"); для успешного завершения, либо Console.WriteLine($"[Error: {ex.Message}]"); Для вывода кода ошибки. Парсинг ошибок на php будет универсальным.
Для этого и нужен конструктор, он вызывает цепочку команд, как если бы аргументы передавались в командную строку
csptest -keyset -enum_keys -veryficontext -fqcn. Это позволяет гибко контролировать запрос. Если не знаете какие методы поддерживает keyset, то можно запросить справку csptest -keyset -help. Никто не мешает обернуть цепочку вызовов в метод и вызывать его одной строкой, но если есть входные данные, их придется передавать в качестве аргументов, а этого я и хотел избежать. Представьте каждый запрос к базе в Laravel оборачивать и вместо текучего интерфейса вагон переменных высыпать в аргументы, при этом пытаться вспомнить в каком порядке они должны быть.
Вы правильно заметили основной посыл - не нужно собирать расширение КриптоПро, вы можете перенести проект на любую операционную систему, где это будет гарантировано работать и для этого не нужно изучать документацию по установке расширений. Но если проект изначально заточен на гибкую работу с подписями, например, вы пишите систему ЭДО как SaaS, то логичнее выбрать SDK или внешний сервис подписания на C#. С# просто имеет лучший набор стабильных инструментов для работы с документами. Например, если вам нужно XML документ конвертировать в читабельный PDF формат и нарисовать штамп что документ подписан электронной подписью, там это сделать проще и менее затратно по оперативной памяти. В общем, зависит от проекта и задач.
Я все-таки сторонник того, чтобы в проекте не было зоопарка из разных языков программирования. Если команда пишет на php, то логично использовать php-расширение и sdk, если это сопоставимо по сложности. Хотя, я не сомневаюсь, что ваш подход тоже хорош и в каких то случаях может быть удобней. Для того, чтобы люди могли попробовать ваше решение - дайте, пожалуста, ссылку на C# проект который подписывает xml со smev-трансформом?
Создание подписи XML документа с использованием Smev-трансформации с помощью php-расширения Crypto Pro