Цифровая подпись PDF-файла в C#

Здравствуйте. Я использую рутокен ЭЦП, на борту которого сгенерирован сертификат. Необходимо подписать PDF-файл с его помощью.
Для генерации поля signature dictionary в документе PDF использую библиотеку iTextSharp. Для доступа к рутокену использую обертку над rtPKCS11ECP.dll.
Генерирую непосредственно подпись с помощью метода CryptoCore.sign. После встраивания этой подписи в pdf, adobe reader говорит: "Ошибка при подтверждении подписи.  Ошибка при проверке:  Неподдерживаемый алгоритм". Подозреваю, что этот метод генерирует не совсем подходящую подпись для pdf.
Подскажите пожалуйста, с помощью этого метода можно ли подписать pdf-документ, если да, то какие указать параметры для генерации подписи?

Re: Цифровая подпись PDF-файла в C#

Здравствуйте.
Adobe Reader ожидает увидеть подпись документа внутри своей собственной структуры.
А с помощью CryptoCore вы оборачиваете документ подписью снаружи, не затрагивая внутреннюю структуру pdf файла.
Поэтому, например КриптоАрм такую подпись проверит, а Acrobat Reader - нет.

Чтобы подписать pdf так, чтобы Reader смог это проверить нужно влезать в формат pdf. А для проверки использовать плагин, например криптопро PDF.

Re: Цифровая подпись PDF-файла в C#

Кирилл Мещеряков пишет:

Чтобы подписать pdf так, чтобы Reader смог это проверить нужно влезать в формат pdf

Я именно так и делаю, т.е. помещаю результат CryptoCore.sign в специальное поле внутри pdf документа. После чего отрываю в Adobe Reader и показывается указанная ошибка подписи. Проверка подписи может осуществляться только с помощью дополнительного плагина? Не могли бы подсказать каким, кроме криптопро pdf, можно воспользоваться?

Re: Цифровая подпись PDF-файла в C#

конечно, чтобы проверить подпись Adobe Reader должен уметь проверять ее.
В америке его конечно не научили проверять российскую подпись. 

Увы, кроме продукта КриптоПро PDF ничего порекомендовать не могу, кроме как написать свой плагин.

Re: Цифровая подпись PDF-файла в C#

Кирилл Мещеряков пишет:

Поэтому, например КриптоАрм такую подпись проверит, а Acrobat Reader - нет.

А для проверки использовать плагин, например криптопро PDF.

Доброго дня.
Файл сделанный вышеописанным способом подпись содержит внутри, а КриптоАрм (бесплатная версия) умеет проверять только открепленную :(

Плагин КриптоПроPDF для работы требует КриптоПро CSP, а его можно получить только после регистрации на сайте  КриптоПро :(

ЗЫ: Максимально облегчить жизнь конечного пользователя пока что не получилось.

Re: Цифровая подпись PDF-файла в C#

По продуктам Крипто-ПРО наверное следует обращаться в Крипто-ПРО
Ваша проблема понятна, но не очень понятно чем мы можем помочь.

Re: Цифровая подпись PDF-файла в C#

Доброго дня.
После успешного локального тестирования получения подписанного pdf-файла перенесли код на сервер, где, собственно, и предполагалось использовать.
Не заработало. :(
Точнее, если взять простое консольное приложение с вышеописанным кодом и запустить непосредственно с сервера (т.е. находясь возле него в серверной), то файл успешно подписывается. А вот все попытки запустить это-же консольное приложение по RDP провалились - ошибка "Инициализатор типа "rtpkicorePINVOKE" выдал исключение".
Аналогичная ошибка и в методе WCF-сервиса, который должен заниматься подписанием.

Мне что-то в настройках сервера поковырять или что-то ещё поискать?

ЗЫ: Панель управления Рутокен, запущенная по RDP не видит ключик, если локально - всё отлично.

Re: Цифровая подпись PDF-файла в C#

Здравствуйте.

a.pokrovsky пишет:

Мне что-то в настройках сервера поковырять или что-то ещё поискать?

ЗЫ: Панель управления Рутокен, запущенная по RDP не видит ключик, если локально - всё отлично.

Похоже что разгадка тут.

(2016-03-30 10:13:19 отредактировано a.pokrovsky)

Re: Цифровая подпись PDF-файла в C#

Антон Тихиенко пишет:

Здравствуйте.
Похоже что разгадка тут.

Не совсем там. Мне не нужен доступ к ключу по RDP, и приложение по RDP запускать никто не будет.
Код должен работать от имени IIS, но этого не происходит, поэтому и расписал все свои попытки понять проблему.

Есть подозрение, что библиотека работы с ключём смотрит на параметры сессии пользователя, отсюда и разница в работе по RDP и локально, но IIS это же служба сервера, которая не имеет такой сессии как пользователь.

Re: Цифровая подпись PDF-файла в C#

a.pokrovsky пишет:

Код должен работать от имени IIS, но этого не происходит, поэтому и расписал все свои попытки понять проблему.

Работоспособность кода под IIS проверяется при помощи удаленного подключения по RDP (т.е выполняется запуск RDP-сессии внутри которой производится тестирование)?

Re: Цифровая подпись PDF-файла в C#

Антон Тихиенко пишет:

Работоспособность кода под IIS проверяется при помощи удаленного подключения по RDP (т.е выполняется запуск RDP-сессии внутри которой производится тестирование)?

Проверяли тремя вариантами:
- подключались к сервису, развернутому в iis, с другой машины и вызывали сервис подписи
- заходили по rdp на сервер и запускали приложение, которое подключалось к сервису, развернутому в iis
- заходили локально и запускали приложение, которое подключалось к сервису, развернутому в iis

Re: Цифровая подпись PDF-файла в C#

a.pokrovsky пишет:

Проверяли тремя вариантами:
- подключались к сервису, развернутому в iis, с другой машины и вызывали сервис подписи
- заходили по rdp на сервер и запускали приложение, которое подключалось к сервису, развернутому в iis
- заходили локально и запускали приложение, которое подключалось к сервису, развернутому в iis

Не работает только во втором случае?

Re: Цифровая подпись PDF-файла в C#

Антон Тихиенко пишет:

Не работает только во втором случае?

Не работают все три варианта. т.е. получается iss не видит библиотек rtpkicoreCSharp.dll, pkcs11_gost.dll и rtPKCS11ECP.dll, хотя от безысходности я напихал их где только смог придумать.

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

Re: Цифровая подпись PDF-файла в C#

Попробуйте в настройках пула приложения iis поставить запуск от имения локальной системы.
Пулы приложений - Дополнительные параметры - Удостоверение - LocalSystem

(2016-03-31 11:22:40 отредактировано a.pokrovsky)

Re: Цифровая подпись PDF-файла в C#

Arkadiy Vasilyev пишет:

Попробуйте в настройках пула приложения iis поставить запуск от имения локальной системы.
Пулы приложений - Дополнительные параметры - Удостоверение - LocalSystem

К сожалению не помогло. :( Будем копать дальше.