Статус: Новичок
Группы: Участники
Зарегистрирован: 18.10.2024(UTC) Сообщений: 4 
|
Написал валидатор PKCS7 ЭЦП с помощью java Bouncy Castle версии 1.70. Данный код корректно валидирует подпись из .p7s файла если передать его в качестве массива байт. Теперь решил прикрутить фронтенд, чтобы пользователь мог по нажатию кнопки подписать что-либо, но на бэкенде не получается сформировать CMSSignedData. Код создания CMSSignedData: Код:
cmsSignedData = new CMSSignedData(signedData);
где signedData - массив байт с подписью. лог полученной ошибки: Код:
2024-12-06T10:51:03.121+03:00 ERROR 23508 --- [cert-validation] [nio-8080-exec-5] c.s.c.controller.TestController : Ed5804826899754576641 | GU01SP | Failed to create CMSSignedData: Malformed content. | cause: [Malformed content.]
Развернутый код ошибки: Код:
org.bouncycastle.cms.CMSException: Malformed content.
at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
at org.bouncycastle.cms.CMSUtils.readContentInfo(Unknown Source)
at org.bouncycastle.cms.CMSSignedData.<init>(Unknown Source)
at com.smp.certvalidation.service.P7SVerifier.extractIssuerURLs(P7SVerifier.java:439)
at com.smp.certvalidation.service.P7SVerifier.getIssuerCertificate(P7SVerifier.java:191)
at com.smp.certvalidation.service.P7SVerifier.verify(P7SVerifier.java:115)
at com.smp.certvalidation.controller.TestController.auth(TestController.java:123)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
at java.base/java.lang.Thread.run(Thread.java:1589)
Caused by: java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DLApplicationSpecific
at org.bouncycastle.asn1.ASN1Sequence.getInstance(ASN1Sequence.java:105)
at org.bouncycastle.asn1.cms.ContentInfo.getInstance(Unknown Source)
... 55 more
Если создать подпись с помощью Крипто Про CSP и передать напрямую в метод класса валидации ошибок нет. На фронтенде использую API КриптоПро ЭЦП browser plug-in Код: <script src="https://www.cryptopro.ru/sites/default/files/products/cades/cadesplugin_api.js"></script>
Вот сам код: Код:
async function signWithCertificate(cert, challenge) {
try {
if (!cert) throw new Error("Certificate is required");
if (!challenge) throw new Error("Challenge data is required");
const signer = await cadesplugin.CreateObjectAsync('CAdESCOM.CPSigner');
await signer.propset_Certificate(cert);
await signer.propset_CheckCertificate(true); // Проверка сертификата
signer.propset_Options = CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
const oSignedData = await cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
try {
await oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
} catch (err) {
e = cadesplugin.getLastError(err);
alert("Не получилось задать encoding. Error: " + e);
return args[1](e);
}
await oSignedData.propset_Content(challenge);
return await oSignedData.SignCades(signer, cadesplugin.CADESCOM_PKCS7_TYPE, true);
} catch (err) {
} catch (error) {
console.error("Error during signing:", error);
throw error;
}
}
Так же прикладываю создаваемую подпись в виде строки: Код:
MIIIfAYJKoZIhvcNAQcCoIIIbTCCCGkCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCC
BMwwggTIMIIEdaADAgECAhN8ABd4V5PpGA4vJM1LAAoAF3hXMAoGCCqFAwcBAQMCMIIBCjEYMBYG
BSqFA2QBEg0xMjM0NTY3ODkwMTIzMRowGAYIKoUDA4EDAQESDDAwMTIzNDU2Nzg5MDEvMC0GA1UE
CQwm0YPQuy4g0KHRg9GJ0ZHQstGB0LrQuNC5INCy0LDQuyDQtC4gMTgxCzAJBgNVBAYTAlJVMRkw
FwYDVQQIDBDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJTAjBgNVBAoM
HNCe0J7QniAi0JrQoNCY0J/QotCeLdCf0KDQniIxOzA5BgNVBAMMMtCi0LXRgdGC0L7QstGL0Lkg
0KPQpiDQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iMB4XDTI0MTExMjA5MjMzOFoXDTI1MDEw
NDEyMzIwMlowGzEZMBcGA1UEAwwQVGVzdCBDZXJ0aWZpY2F0ZTBmMB8GCCqFAwcBAQEBMBMGByqF
AwICJAAGCCqFAwcBAQICA0MABEDbcyXSFFiszHyN3p2BItry3wZgkWSYTeEcbI41F2CEGfGrl5ci
Aj19NkYuHIKHZ18v01GuEuDowMMqkf6WxR9Mo4ICmDCCApQwDgYDVR0PAQH/BAQDAgTwMB0GA1Ud
DgQWBBTvlCtJoRmMPs6Pl6Giv5M2FWYS0jAfBgNVHSMEGDAWgBTkwICW5LR4NBI8Irl1zZYgQzCw
IzCCARIGA1UdHwSCAQkwggEFMIIBAaCB/qCB+4aBtmh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRv
cHJvLnJ1L0NlcnRFbnJvbGwvITA0MjIhMDQzNSEwNDQxITA0NDIhMDQzZSEwNDMyITA0NGIhMDQz
OSUyMCEwNDIzITA0MjYlMjAhMDQxZSEwNDFlITA0MWUlMjAhMDAyMiEwNDFhITA0MjAhMDQxOCEw
NDFmITA0MjIhMDQxZS0hMDQxZiEwNDIwITA0MWUhMDAyMigxMCkuY3JshkBodHRwOi8vdGVzdGdv
c3QyMDEyLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3Rnb3N0MjAxMigxMCkuY3JsMIIBKgYI
KwYBBQUHAQEEggEcMIIBGDA/BggrBgEFBQcwAYYzaHR0cDovL3Rlc3Rnb3N0MjAxMi5jcnlwdG9w
cm8ucnUvb2NzcDIwMTJnL29jc3Auc3JmMEEGCCsGAQUFBzABhjVodHRwOi8vdGVzdGdvc3QyMDEy
LmNyeXB0b3Byby5ydS9vY3NwMjAxMmdzdC9vY3NwLnNyZjBMBggrBgEFBQcwAoZAaHR0cDovL3Rl
c3Rnb3N0MjAxMi5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC90ZXN0Z29zdDIwMTIoMTApLmNydDBE
BggrBgEFBQcwAoY4aHR0cDovL3Rlc3Rnb3N0MjAxMi5jcnlwdG9wcm8ucnUvQ2VydEVucm9sbC90
ZXN0cm9vdC5wN2IwCgYIKoUDBwEBAwIDQQBMuMIx4VhYd/FMBpz6YGubHeSGyORMFeb+p8gnf9x5
0DEPrhBnqJZ+82Car+PTkMMsBzGX+/chOYag0OT4YRLMMYIDdTCCA3ECAQEwggEjMIIBCjEYMBYG
BSqFA2QBEg0xMjM0NTY3ODkwMTIzMRowGAYIKoUDA4EDAQESDDAwMTIzNDU2Nzg5MDEvMC0GA1UE
CQwm0YPQuy4g0KHRg9GJ0ZHQstGB0LrQuNC5INCy0LDQuyDQtC4gMTgxCzAJBgNVBAYTAlJVMRkw
FwYDVQQIDBDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJTAjBgNVBAoM
HNCe0J7QniAi0JrQoNCY0J/QotCeLdCf0KDQniIxOzA5BgNVBAMMMtCi0LXRgdGC0L7QstGL0Lkg
0KPQpiDQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iAhN8ABd4V5PpGA4vJM1LAAoAF3hXMAwG
CCqFAwcBAQICBQCgggHnMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8X
DTI0MTIwNjA4MDYyOVowLwYJKoZIhvcNAQkEMSIEID+wcApBzm5BQTunZPmL8hNbpt7VFr6i+uhC
nMW91G1tMIIBegYLKoZIhvcNAQkQAi8xggFpMIIBZTCCAWEwggFdMAoGCCqFAwcBAQICBCCE89i/
yPgaOKcTrsxdk3e1ITNaI9rwCSYIJJ7+MZxM2DCCASswggESpIIBDjCCAQoxGDAWBgUqhQNkARIN
MTIzNDU2Nzg5MDEyMzEaMBgGCCqFAwOBAwEBEgwwMDEyMzQ1Njc4OTAxLzAtBgNVBAkMJtGD0Lsu
INCh0YPRidGR0LLRgdC60LjQuSDQstCw0Lsg0LQuIDE4MQswCQYDVQQGEwJSVTEZMBcGA1UECAwQ
0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB0LrQstCwMSUwIwYDVQQKDBzQntCe0J4g
ItCa0KDQmNCf0KLQni3Qn9Cg0J4iMTswOQYDVQQDDDLQotC10YHRgtC+0LLRi9C5INCj0KYg0J7Q
ntCeICLQmtCg0JjQn9Ci0J4t0J/QoNCeIgITfAAXeFeT6RgOLyTNSwAKABd4VzAKBggqhQMHAQEB
AQRAUz1PItX3cyiYY16L5bQ88Mb8NXYvlZomDdyGvbgP1GMn/KEuBMPYK0QtB10ZQZbpdT7jC+se
Qiv/99zFWaIf2w==
При проверке созданной подписи на сайте: https://dss.cryptopro.ru/verify/#/signature таких ошибок не получаю. Единственное что сайт ругается на то, что не удается построить цепочку сертификатов, но это нормально т.к. сертификат подписи тестовый. Прошу подсказать в чем может быть проблема, подозреваю что как-то неправильно формирую подпись на фронтенде, пробовал разные способы но все тщетно.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,766   Сказал «Спасибо»: 579 раз Поблагодарили: 2307 раз в 1807 постах
|
Здравствуйте. Цитата:Если создать подпись с помощью Крипто Про CSP и передать напрямую в метод класса валидации ошибок нет. На фронтенде использую API КриптоПро ЭЦП browser plug-in Во всех случаях подпись формирует криптопровайдер. в p7s что? der (бинарные данные)? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.10.2024(UTC) Сообщений: 4 
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close