NCANode
NCANode copied to clipboard
CMS verify падает с ошибкой, когда CMS содержит просроченный сертификат.
Подписал документ с действующим сертификатом. Но когда истек срок сертификата, проверил подпись CMS, и NcaNode падает с 500 ошибкой.
Stack Trace:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at kz.ncanode.api.core.ApiController.invokeMethod(ApiController.java:67)
at kz.ncanode.api.core.ApiController.callMethod(ApiController.java:39)
at kz.ncanode.api.version.v20.ApiVersion20.process(ApiVersion20.java:99)
at kz.ncanode.api.ApiServiceProvider.process(ApiServiceProvider.java:96)
at kz.ncanode.interaction.interactors.HttpInteractor$HttpApiHandler.handle(HttpInteractor.java:99)
at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
at sun.net.httpserver.ServerImpl$DefaultExecutor.execute(Unknown Source)
at sun.net.httpserver.ServerImpl$Dispatcher.handle(Unknown Source)
at sun.net.httpserver.ServerImpl$Dispatcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.cert.CertificateExpiredException: certificate expired on 20211112033559GMT+00:00
at kz.gov.pki.kalkan.jce.provider.X509CertificateObject.checkValidity(X509CertificateObject.java:134)
at kz.gov.pki.kalkan.jce.provider.X509CertificateObject.checkValidity(X509CertificateObject.java:125)
at kz.ncanode.api.version.v20.controllers.CmsController.verify(CmsController.java:165)
... 19 more
Думаю, если в CMS есть TSP подпись, то при вызове функции cert.checkValidity();
нужно передать дату подписания.
https://github.com/kolesa-team/NCANode/blob/ad3135f9c097f5d3b3fbc1e727e36a8e3d61eb00/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L170
@antonsergeyev В вашем форке не встречались ли с данной проблемой и не исправляли ли?
не встречались, но мы пока и не вызываем verify
@uelnur а там вообще нужна эта валидация при verify? В ответе же и так есть статус сертификата valid=false, а имея даты notAfter/notAfter и дата генерации tsp, на клиенте можно подсвечивать факт использования протухшего серта. Я пока просто закомментил cert.checkValidity().
@vbkunin
Думаю в verify нужно проверять сроки использованных при подписании сертификатов на основе tsp, иначе эту задачу мы оставляем клиентам.
Это я исправил в своем форке, но пока костыльно. Java не мой профильный язык программирования. Нужно как нибудь отрефакторить.
https://github.com/uelnur/NCANode/blob/3c028aad3adcc0e553ff8cbd92def9c86a840e1a/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L187
@uelnur по коду может быть несколько tsp (не знаю, как на практике), относительно какого в таком случае проверять? Согласен, что на клиент правильнее будет отдать результат проверки, но не думаю, что в самом сертификате valid на true менять нудно. Может где-то рядом это положить.
@vbkunin Согласно данной строке, должен бросать исключение, если tsp несколько. https://github.com/malikzh/NCANode/blob/3ae273c8cec32a208a6de607a330d47444e2033b/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L202
Нет, я про этот список: https://github.com/malikzh/NCANode/blob/3ae273c8cec32a208a6de607a330d47444e2033b/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L199
@vbkunin
Если есть только один tsp, то проверять по нему. Если нет или несколько, то это уже другая ситуация.
Например, в сервисе https://ezsigner.kz/ если проверить CMS где нет TSP, то выдает красное предупреждение. Если tsp несколько, то он кажется проверяет по самому первому (или даже может случайно). Я пробовал проверить CMS с нескольким TSP в одной подписи.
@vbkunin
Так же, подпись можно проверить по каждому TSP. Поскольку TSP подпись не может же быть добавлен, когда сертификат просрочен или еще срок не пришел. Если при проверке по одной из TSP выходит ошибка, значит здесь что-то не то
А несколько TSP в одной подписи это законно вообще? Со своими "несколькими" TSP я разобрался. На самом деле у меня их по одному в подписи, просто док подписан 4 раза, три из которых одним и тем же подписантом. В итоге метод verify криво орудует массивами и три одинаковых подписанта три раза раза проходит. В ответе у меня 9 + 1 подписант)) Пойду поковыряю CMSUtil класс, по нему хоть какое-то описание есть.
А несколько TSP в одной подписи это законно вообще?
Меня тоже интересует данный вопрос, ответа не знаю.
Проект NCA Node очень полезный, особенно когда многие вещи в КЗ переходит на электронку. Премного благодарен автору.
Методы работы с CMS нужно как-нибудь отрефакторить, разделить по классам и методам, чтобы удобно было писать тесты. И выносить всю логику из контроллера =) Чтобы можно было использовать и через консоль или внедрить в другой проект как зависимость
Потихоньку изучаю Java, постараюсь с этим помочь