- Я решил странную проблему с полем «Причина» подписи.
- Кажется, я не вижу, чтобы каким-либо образом Дата подписания отличалась от временной отметки, предоставленной властями времени.
Объяснение следует.
НасколькоВ первом случае это была моя вина.Для уточнения, насколько я понимаю, параметры подписи предоставляются методам DSS два раза с использованием метода SigningService.fillParameters ().
- в SigningService.getDataToSign (...) и затем
- в SigningService.signDocument (...)
Это важно сделатьв обоих методах, потому что в первый раз вычисляется хэш / дайджест документа, подлежащего подписанию.Поскольку я выбрал подпись, которая должна быть заключена в оболочку, то есть должна содержаться в документе, который будет подписан, нам нужно сначала применить подпись, а затем вычислить дайджест на основе этого «окончательного» документа.
Насколько я видел в коде DSS (приблизительно), представление загруженного PDF в памяти подписывается, и его дайджест вычисляется во время getDataToSign - но результат отбрасывается.
Во время самого метода signDocument (между тем дайджест отправляется обратно на клиент с установленным NexU и возвращается обратно на сервер с подписью), загруженный PDF снова подписывается, его дайджест вычисляется снова, но этовремя фактического подписанного дайджеста (мы получили от клиента) также применяется к документу - и результат этой операции в памяти отправляется обратно клиенту как подписанный документ PDF.
Что я делал неправильно, так это то, что в первый раз я терял переменную, которую собирался добавить в качестве Причины (она была потеряна где-то в атрибутах модели - я не передавал ее где-то посередине).запросы), в результате чего моя первая карта параметров, переданная в getDataToSign, отличается от второй карты параметров - поэтому вполне логично, что фактический хэш / дайджест документа отличался от дайджеста в сохраненной подписи (поскольку привремя, когда был рассчитан дайджест, который нужно подписать, я не передавал причину).Вот почему, когда я передавал жестко закодированное значение, поскольку оно было жестко закодировано, оно присутствовало при обоих вызовах fillParameters.Это была такая глупая ошибка, я знаю.Я должен был знать это, потому что не было абсолютно ничего о каких-либо трудностях с передачей Reason (или других полей, таких как Location) в Signature.
Кстати, подпись выполняется с помощью Apache PDFBox и постепенно.
Что касается второго, мы решили оставить все как есть, хотя между отметкой времени подписания и авторитетной отметкой времени существует сравнительно впечатляющий разрыв.Я действительно не знаю, какими должны быть допустимые пробелы в подобных случаях.Я предполагаю, что это происходит потому, что
- Мой сервер может иметь немного необычное местное время
- Поскольку весь процесс подписи происходит между двумя компьютерами (сервером и клиентом с NexUустановлена, а также смарт-карта), а также потому, что появляются разные диалоговые окна с запросом пароля и т. д., - все это откладывает фактическое подписание, и обращение к метке времени делается на самом последнем этапе.Конечно, я не уверен, что это проблема, так как теоретически авторитет времени не знает о фактическом изменении содержимого - в этом случае была бы вызвана предыдущая ошибка.
Этобольше нравится - конечно, я открыт для других комментариев и ответов.Спасибо!