NCANode icon indicating copy to clipboard operation
NCANode copied to clipboard

CMS verify падает с ошибкой, когда CMS содержит просроченный сертификат.

Open uelnur opened this issue 3 years ago • 12 comments

Подписал документ с действующим сертификатом. Но когда истек срок сертификата, проверил подпись 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

uelnur avatar Nov 17 '21 17:11 uelnur

@antonsergeyev В вашем форке не встречались ли с данной проблемой и не исправляли ли?

uelnur avatar Nov 17 '21 17:11 uelnur

не встречались, но мы пока и не вызываем verify

antonsergeyev avatar Nov 18 '21 03:11 antonsergeyev

@uelnur а там вообще нужна эта валидация при verify? В ответе же и так есть статус сертификата valid=false, а имея даты notAfter/notAfter и дата генерации tsp, на клиенте можно подсвечивать факт использования протухшего серта. Я пока просто закомментил cert.checkValidity().

vbkunin avatar Feb 18 '22 16:02 vbkunin

@vbkunin

Думаю в verify нужно проверять сроки использованных при подписании сертификатов на основе tsp, иначе эту задачу мы оставляем клиентам.

Это я исправил в своем форке, но пока костыльно. Java не мой профильный язык программирования. Нужно как нибудь отрефакторить.

https://github.com/uelnur/NCANode/blob/3c028aad3adcc0e553ff8cbd92def9c86a840e1a/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L187

uelnur avatar Feb 18 '22 16:02 uelnur

@uelnur по коду может быть несколько tsp (не знаю, как на практике), относительно какого в таком случае проверять? Согласен, что на клиент правильнее будет отдать результат проверки, но не думаю, что в самом сертификате valid на true менять нудно. Может где-то рядом это положить.

vbkunin avatar Feb 18 '22 17:02 vbkunin

@vbkunin Согласно данной строке, должен бросать исключение, если tsp несколько. https://github.com/malikzh/NCANode/blob/3ae273c8cec32a208a6de607a330d47444e2033b/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L202

uelnur avatar Feb 18 '22 18:02 uelnur

Нет, я про этот список: https://github.com/malikzh/NCANode/blob/3ae273c8cec32a208a6de607a330d47444e2033b/src/main/java/kz/ncanode/api/version/v20/controllers/CmsController.java#L199

vbkunin avatar Feb 18 '22 18:02 vbkunin

@vbkunin

Если есть только один tsp, то проверять по нему. Если нет или несколько, то это уже другая ситуация.

Например, в сервисе https://ezsigner.kz/ если проверить CMS где нет TSP, то выдает красное предупреждение. Если tsp несколько, то он кажется проверяет по самому первому (или даже может случайно). Я пробовал проверить CMS с нескольким TSP в одной подписи.

uelnur avatar Feb 18 '22 19:02 uelnur

@vbkunin

Так же, подпись можно проверить по каждому TSP. Поскольку TSP подпись не может же быть добавлен, когда сертификат просрочен или еще срок не пришел. Если при проверке по одной из TSP выходит ошибка, значит здесь что-то не то

uelnur avatar Feb 18 '22 19:02 uelnur

А несколько TSP в одной подписи это законно вообще? Со своими "несколькими" TSP я разобрался. На самом деле у меня их по одному в подписи, просто док подписан 4 раза, три из которых одним и тем же подписантом. В итоге метод verify криво орудует массивами и три одинаковых подписанта три раза раза проходит. В ответе у меня 9 + 1 подписант)) Пойду поковыряю CMSUtil класс, по нему хоть какое-то описание есть.

vbkunin avatar Feb 18 '22 19:02 vbkunin

А несколько TSP в одной подписи это законно вообще?

Меня тоже интересует данный вопрос, ответа не знаю.

uelnur avatar Feb 18 '22 19:02 uelnur

Проект NCA Node очень полезный, особенно когда многие вещи в КЗ переходит на электронку. Премного благодарен автору.

Методы работы с CMS нужно как-нибудь отрефакторить, разделить по классам и методам, чтобы удобно было писать тесты. И выносить всю логику из контроллера =) Чтобы можно было использовать и через консоль или внедрить в другой проект как зависимость

Потихоньку изучаю Java, постараюсь с этим помочь

uelnur avatar Feb 18 '22 19:02 uelnur