При проверке подписи получаем сообщение ''Подпись не верна''. Какие могут быть причины получения такого сообщения?
Решение
Возможные причины:
Проблема в сертификате пользователя:
а) в нем нет цепочки сертификатов, а его издатель не прошел проверку
б) один из сертификатов в цепочке не прошел проверку
в) сертификат в списках отзыва
г) сертификат просрочен
Проблемы на сервере:
а) неправильно настроено Крипто Про
б) не хватает корневых и промежуточных сертификатов в хранилище ключей java cacerts
При нажатии на кнопку Проверить подписи происходит проверка и в лог системы пишется информация с причиной отсутствия валидности подписи. Чтобы сообщение отразилось в логе, лог должен быть настроен на режим DEBUG.
Ниже рассмотрены некоторые ошибки, возникающие в логе при получении уведомления пользователем “Подпись не верна”.
При проверке подписи получаем сообщение ''Подпись не верна''. В логе ошибка вида ''For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation; error codes: 44 'Certificate status is unknown or revoked',''. Что это значит?
Решение
Это сообщение говорит о том, что хотя бы один сертификат цепочки не прошел проверку по спискам отзыва.
Для прохождения проверки параметр “Точки распределения…” должен быть и в промежуточном, и в корневом сертификатах, и в персональном.
На данный момент в имеющемся корневом сертификате данного параметра нет, и он не может пройти проверку.
Проверка списков отзыва реализована в системе только по ссылке на список отозванных сертификатов, которая находится внутри самого сертификата пользователя. На скриншоте показан пример сертификата, который выдается тестовым удостоверяющим центром:
На скриншоте ниже пример сертификата без этой информации ( в нем нет позиции “Точка распределения списка отзыва (CRL)”:
Сертификаты нужно будет перевыпустить. Сделать это можно в том же УЦ, убедившись, что он теперь содержит параметр со ссылками на списки отзыва. При получении сертификатов у Вас должна быть возможность выбрать необходимые параметры. Далее, нужно будет импортировать новый корневой сертификат в хранилище вместо текущего.
При проверке подписи получаем сообщение ''Подпись не верна''. В логе ошибка вида 'Root certificate is in the certificate chain but not in cacerts'
Пример ошибки в логе
Root certificate: sn 3b208ae5fd46688649a050faafa88393, subject CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", L=Москва, ST=г. Москва, C=RU, STREET=ул. Сущёвский вал д. 18, OID.1.2.643.3.131.1.1=#120C303031323334353637383930, OID.1.2.643.100.1=#120D31323334353637383930313233, issuer CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", L=Москва, ST=г. Москва, C=RU, STREET=ул. Сущёвский вал д. 18, OID.1.2.643.3.131.1.1=#120C303031323334353637383930, OID.1.2.643.100.1=#120D31323334353637383930313233 is untrusted; error codes: 32 'Root certificate is in the certificate chain but not in cacerts'
Решение
В сообщении содержится информация, что в хранилище ключей java не найден корневой сертификат из цепочки. Следовательно, если он должен там быть, его необходимо импортировать.
Для устранения ошибки необходимо корневые или промежуточные сертификаты из цепочки личного сертификата добавить в cacerts на сервере, на котором установлен КриптоПРО:
-
Открыть консоль с правами администратора из папки с версией java, которая используется для работы системы ТЕЗИС (например,
C:\Program Files\Java\jdk1.8.0_201\jre\bin
), для каждого из сертификатов выполнить следующую команду:keytool.exe -importcert -file "{PATH_TO_CA_CERT}" -alias {CERT_ALIAS} -keystore "{PATH_TO_JRE}/lib/security/cacerts"
, где:
keytool.exe
- утилита в дирекорииJRE/bin
, директорияbin
JDK,
{PATH_TO_CA_CERT}
- путь к корневому или промежуточному сертификату,
{CERT_ALIAS}
- алиас сертификата для установки в хранилище (любой текст),
{PATH_TO_JRE}
- место установки JRE.Например, команда с заполненными параметрами выглядит следующим образом:
keytool.exe -importcert -file "C:\Program Files\Java\jdk1.8.0_121\jre\bin\сертификат.cer" -alias имя_алиаса -keystore "C:\Program Files\Java\jdk1.8.0_121\jre\lib\security\cacerts"
-
Для применения настроек необходимо произвести перезапуск службы tomcat.
При проверке подписи получаем сообщение ''Подпись не верна''. В логе ошибка вида 'ru.CryptoPro.JCP.tools.Starter check SEVERE: ERROR loading JCP java.lang.NoClassDefFoundError: Could not initialize class ru.CryptoPro.JCP.Random.CPRandom'.
Решение
Данная ошибка вызвана тем, что при установке JCP была выбрана опция “Включить усиленный контроль использования ключей”. В этом случае первый вызов нужно выполнить вручную, т.к. требуется ввод с клавиатуры вручную. Для этого в командной строке выполните:
java ru.CryptoPro.JCP.tools.Check -all
После завершения выполнения перезапустите службу Tomcat.
При попытке проверки подписи получаем сообщение ''java.lang.NoSuchMethodError: org.bouncycastle.cms.SignerInformation.<init>(Lorg/bouncycastle/cms/SignerInformation;)V at ru.CryptoPro.CAdES.cl_7.<init>(Unknown Source) at ru.CryptoPro.CAdES.CAdESSigner.<init>(Unknown Source) at ru.CryptoPro.CAdES.CAdESSignerRawImpl.<init>(Unknown Source)'.
Ошибка в интерфейсе выглядит следующим образом:
Решение
Необходимо уточнить используемую версию КриптоПро JCP на сервере ТЕЗИС. Далее убедитесь, что библиотеки bcpkix-jdk15on-1.Х0.jar
и bcprov-jdk15on-1.Х0.jar
из дистрибутива КриптоПро JCP в каталоге \jcp-2.0.38481\dependencies
скопированы в папку $JRE_HOME\lib\ext
. Версия этих библиотек в $JRE_HOME\lib\ext
не отличается от тех, что расположены в \jcp-2.0.38481\dependencies
.
При попытке проверки подписи получаем сообщение вида ''java.lang.NullPointerException''.
-
Ошибка в логах выглядит так:
11:47:14,008 ERROR [ServiceInterceptor] [app-core] [muet-ufa\Bikov.AN] Exception: java.lang.NullPointerException at com.haulmont.thesis.core.app.signature.CryptoProServerSignatureSupport.toHexString(CryptoProServerSignatureSupport.java:33) at com.haulmont.thesis.core.app.signature.CryptoProServerSignatureSupport.getHash(CryptoProServerSignatureSupport.java:22) at com.haulmont.thesis.core.app.SignatureServiceBean.getHash(SignatureServiceBean.java:84) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150
Решение
Проблема на стороне сервера. Необходимо проверить, что при установке КриптоПро JCP использовалась java, на которой запущен ТЕЗИС. Если использовался неверный путь, потребуется переустановить КриптоПро JCP с указанием верного пути до java.
-
Ошибка в логах выглядит следующим образом:
java.lang.NullPointerException at org.apache.commons.codec.binary.Hex.encodeHex(Hex.java:141) at org.apache.commons.codec.binary.Hex.encodeHex(Hex.java:125) at org.apache.commons.codec.binary.Hex.encodeHex(Hex.java:109) at org.apache.commons.codec.binary.Hex.encodeHexString(Hex.java:161) at com.haulmont.thesis.core.app.signature.CryptoProServerSignatureSupport.getHash(CryptoProServerSignatureSupport.java:43)
Решение
- Возможно, после установки JCP не был перезагружен сервер. Ошибка встречается на серверах под управлением ОС Linux.
В таком случае выполните перезагрузку сервера и проверьте возможность подписания.
- Так же данная ошибка может появиться, если в файле
java.security
не прописаны провайдеры JCP. (Данная проблема не актуальна для версии тезиса 5.0+)
Для диагностики из командной строки из папки
jdk\jre\bin\
, той java, на которой работает система и установлен КриптоПро, выполните команду:java ru.CryptoPro.JCP.tools.Check -all
При выполнении данной команды может требовать случайный ввод с клавиатуры (это значит, что при установке выставили “Включить усиленный контроль использования ключей”).
По окончанию работы команды в папке появится
CryptoProJCPInfo.jar
, внутри которого есть текстовый результат диагностики.Для исправления необходимо открыть на редактирование файл
jdk\jre\lib\security\java.security
и добавить недостающие строки по порядку, если их нет:security.provider.11=ru.CryptoPro.JCP.JCP security.provider.12=ru.CryptoPro.reprov.RevCheck security.provider.13=ru.CryptoPro.Crypto.CryptoProvide
Как определить, какую java указывать при установке КриптоПро JCP?
Решение
Установка JCP должна обязательно осуществляться в JRE, которая используется для СЭД ТЕЗИС.
Посмотреть ее можно в системе, открыв пункт меню «Администрирование» - «Консоль JMX» - «java.lang:type=Runtime» в атрибуте BootClassPath:
При попытке проверки подписи получаем сообщение ''java.lang.ClassNotFoundException: org.bouncycastle.cms.CMSException' или 'java.lang.ClassNotFoundException: org.bouncycastle.cms.XadesException'.
Решение
-
Не корректно установлен JCP. Установка проведена без опций:
"Криптопровайдер JCP" - yes "Модули CAdES, XAdES, требуют bouncycastle: bc*-jdk15on-1.50" - yes
Необходимо переустановить JCP с данными опциями.
-
Ошибка может появляться, если при установке не был выполнен пункт о библиотеках bc*.
Проверьте, чтобы в папке
tomcat\shared\lib
нет библиотекbcmail-jdk15-1.45.jar
иbcprov-jdk15-1.45.jar
. Если есть - удалите.Проверьте наличие в папке
jre\lib\ext
библиотекbcpkix-jdk15on-1.60.jar
,bcprov-jdk15on-1.60.jar
. Если их нет, то скопируйте их из дистрибутива КриптоПро (jcp-2.0.41473\dependencies
)
При проверке подписи получаем сообщение ''Подпись не верна''. В логе присутствует ошибка 'FileStorageException'.
Пример ошибки в логе
ERROR [com.haulmont.cuba.core.app.FileStorage] [app-core] [admin] File /opt/haulmont/tomcat/fstorage/2019/11/11/4ebfbb3e-3612-6cb1-5a13-af9dc0107bc5.docx not found 2022-06-23 12:56:40,555
ERROR [com.haulmont.thesis.core.app.SignatureWorkerBean] [app-core] [admin] Error open signed data stream com.haulmont.cuba.core.global.FileStorageException: File not found: 4ebfbb3e-3612-6cb1-5a13-af9dc0107bc5]
Решение
Система ссылается на отсутствие файла в файловом хранилище. Необходимо проверить:
- Присутствует ли файл в ФХ по указанному в логе пути.
- Есть ли возможность скачать файл из системы.
При подписании у пользователя происходит ошибка ''Невозможно прочитать файл сертификата''.
Ошибка в ТЕЗИС:
Решение
Проблема в том, что у пользователя открывается окно ТЕЗИС:Помощника, а не CSP. Помощник не должен использоваться при подписании сертификатом КриптоПро. За это отвечает настройка у пользователя в пункте меню Помощь → Настройки → Тип электронной подписи. Должен быть выбран чек-бокс “КриптоПро”.
Необходимо проверить эту настройку у пользователя и выбрать нужный тип подписи.
Дополнительно убедитесь, что в конфигурационных файлах tomcat\conf\app\local.web-app.properties
и tomcat\conf\app-core\local.app.properties
применена настройка:
thesis.SignatureTypeDefault - для ТЕЗИС 4.1
thesis.userSignatureTypeDefault=CryptoPro - для ТЕЗИС 4.2 и выше.
Этот параметр по умолчанию всем пользователям указывает Тип подписи=КриптоПро.
При подписании у пользователя происходит ошибка ''Не удалось загрузить плагин. Плагин недоступен''.
Ошибка в интерфейсе системы:
Решение
Согласно скриншоту можно сделать вывод, что в браузере не установлен КриптоПро ЭЦП Browser plug-in . Необходимо проверить его наличие на ПК. Так же необходимо проверить, что на ПК установлено Крипто CSP.
При подписании электронной подписью под замещением система запрашивает пароль. У сертификата нет пароля, используется УКЭП.
Уведомление в интерфейсе:
Решение
При подписании сертификатом КриптоПро не должен использоваться ТЕЗИС:Помощник, то есть не должно возникать окно, которое указано на скриншоте.
У пользователя (без использования замещения) откройте пункт меню Помощь-Настройки. В поле “Тип электронной подписи” чек-бокс должен быть установлен на “КриптоПро”.
Так же просим убедиться, что у пользователя на ПК есть необходимые программы для подписи КриптоПро (CSP и КриптоПро Browser plug-in).
При попытке подписать документ при помощи ЭП (КриптоПро) система выдает ошибку ''Could not initialize JavaScriptConnector because no JavaScript init function was found.''
В системе данное окно выглядит примерно так:
Решение
Необходимо проверить в каталоге/tomcat/webapps/app/VAADIN/resources/js
наличие библиотек для КриптоПро. Должны быть следующие библиотеки:
Если папка cryptopro
отсутствует, необходимо взять ее из дистрибутива ТЕЗИС Вашей версии. Если папки с дистрибутивами у Вас нет, необходимо обратиться к технической поддержке ТЕЗИС.
После добавления необходимой папки с файлами выполнить рестарт службы tomcat.
В окне выбора сертификата пусто. Почему такое может быть?
Решение
- Нужно добавить сертификат пользователя в хранилище личных сертификатов.
- Нужно добавить корневой сертификат в хранилище доверенных сертификатов.
- Убедиться, что установлен КриптоПро ЭЦП Browser plug-in.
При попытке подписать документ, падает следующая ошибка: Не удалось создать подпись из-за ошибки. Ошибка исполнения функции (0Х8007065В).
Ошибка в интерфейсе системы:
Решение
Истёк срок действия КриптоПро CSP. Для проверки необходимо запустить КриптоПро CSP. На вкладке “Общие”, дата “Лицензия CSP” должна быть больше текущей.
При попытке подписать документ система выдает сообщение ''Выбранный тип ЭП не поддерживает.''
Решение
В лицензии ТЕЗИС не включена Интеграция с КриптоПро . Необходимо обратиться в техническую поддержку за лицензией.
Какие версии КриптоПРО JCP поддерживает ТЕЗИС 5.0?
Решение
Версии для JRE 8:
КриптоПро JCP и JTLS R4 (2.0.41789)
Версии для JRE 11:
КриптоПро JCP и JTLS R3 (2.0.40450-А, для JVM версии 10 и выше)
КриптоПро JCP и JTLS R4 (2.0.41940-А, для JVM версии 10 и выше)
Для версии ТЕЗИС 5.0+ версия библиотек bcpkix- и bcprov- должна быть 1.60 и выше.**
На сервер необходимо установить только CryptoPro JCP или ещё какое то ПО?
Решение
Да, на сервер необходимо установить КриптоПро JCP и прописать в jdk корневой сертификат.
Также потребуется внести параметры для использования КриптоПро в конфигурационные файлы системы.
Какой сертификат для сервера нужен?
Решение
Файл сертификата должен быть формата X.509 (.cer) в кодировке DER. Он должен быть корневой и связан по цепочке со всеми ЭП пользователей. Обычно он приобретается в аккредитовнаном Удостоверяющем Центре. Можно напрямую обратиться к официальному источнику https://www.cryptopro.ru/order/ и уточнить подробную информацию по сертификатам ПО, которое необходимо приобрести.
Для тестирования Вы можете использовать тестовый сертификат. Как его создать, описано в Создание тестового сертификата.
Для чего нужен корневой сертификат? Для создания локального центра проверки сертификатов наших сотрудников?
Решение
Корневой сертификат - это главный сертификат Удостоверяющего центра, которым подписываются все пользовательские сертификаты. Он сам подписан корневым сертификатом Головного Удостоверяющего Центра.
Да, он нужен для проверки всей цепочки. В ходе проверки цепочки учитываются следующие сертификаты:
Сертификат пользователя - корневой УЦ - корневой ГУЦ.
Корневой ГУЦ по определению должен устанавливаться в качестве доверенного в ОС.
Суть проверки цепочки сертификатов - выстроить эту цепь до корневого ГУЦ, в чём корневой УЦ играет очень важную роль.
Уточните, о каком корневом сертификате идет речь? У наших сертификатов, полученных в Контуре, по цепочке получается три звена: сертификат Минцифры, аккредитованный УЦ СКБ Контур и сертификат самого пользователя. Что нужно импортировать в cacerts?
Решение
Необходимо импортировать все корневые и промежуточные сертификаты от всех пользовательских в ...\lib\security\cacerts
.