Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Здравствуйте! Подписываю файл как описано в примере (java 1.7.0_7, jcp 1.0.54): Код:public static byte[] createCAdESSignature(final byte[] data, final KeyStoreHolder keyStoreHolder) {
try {
// Включаем возможность онлайновой проверки.
System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
final Collection<X509Certificate> chain = new ArrayList<>();
final List<Certificate> lChain = Arrays.asList(keyStoreHolder.getCertificateChain());
// Конвертируем цепочку в X509Certificate.
Collection<X509Certificate> xChain =
Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
chain.addAll(xChain);
PrivateKey privateKey = keyStoreHolder.getPrivateKey();
CAdESSignature cadesSignature = new CAdESSignature(false);
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner(BouncyCastleProvider.PROVIDER_NAME, OID_SHA1,
OID_RSA, privateKey, chain, CAdESType.CAdES_BES, null, false);
// Завершаем создание подписи с двумя подписантами.
byte[] cadesCms = cadesSignature.sign(data);
Array.writeFile("C:\\testsignature.txt", cadesCms);
// Проверяем подпись.
cadesSignature = new CAdESSignature(cadesCms, null, null);
// Если задан CRL, то читаем его из файла.
if (Configuration.CRL_FILENAME != null) {
X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509")
.generateCRL(new FileInputStream(Configuration.CRL_FILENAME));
cadesSignature.verify(chain, Collections.singletonList(crl));
} else {
cadesSignature.verify(chain);
}
Configuration.printSignatureInfo(cadesSignature);
return cadesCms;
} catch (Exception e) {
Configuration.printCAdESException(e);
return null;
}
}
В момент создания подписанта: Код:cadesSignature.addSigner(BouncyCastleProvider.PROVIDER_NAME, OID_SHA1,
OID_RSA, privateKey, chain, CAdESType.CAdES_BES, null, false);
вылетает exception: Код:2015-08-13 16:48:08.081 INFO 7228 --- [ main] ru.CryptoPro.JCP.tools.JCPLogger : Replacement of BouncyCastle GOST algorithms.
2015-08-13 16:48:13.118 INFO 7228 --- [ main] ru.CryptoPro.JCP.tools.JCPLogger : Add signer certificate
{...... данные сертификата .........}
signature provider: BC
PKIX validator: CPPKIX of RevCheck
revocation enabled: false
online: false
2015-08-13 16:48:13.468 WARN 7228 --- [ main] ru.CryptoPro.JCP.tools.JCPLogger : ERROR
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at ru.CryptoPro.reprov.CPCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at ru.CryptoPro.CAdES.b.d.a.a(Unknown Source)
at ru.CryptoPro.CAdES.b.d.a.a(Unknown Source)
at ru.CryptoPro.CAdES.b.d.a.a(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignature.addSigner(Unknown Source)
at ru.russianpost.oneclick.signservice.cades.CAdESSignatureUtils.createCAdESSignature(CAdESSignatureUtils.java:69)
at ru.russianpost.oneclick.signservice.service.impl.SimpleSignatureService.generateCMSSign(SimpleSignatureService.java:232)
at ru.russianpost.oneclick.signservice.web.api.SimpleSignatureController.generateCMSSign(SimpleSignatureController.java:65)
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:601)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:144)
at ru.russianpost.oneclick.signservice.web.api.SimpleSignatureTest.testGenerateCMSSign(SimpleSignatureTest.java:163)
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:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
2015-08-13 16:48:13.478 ERROR 7228 --- [ main] ru.CryptoPro.JCP.tools.JCPLogger : PKIX failure: invalid certificate parameters
PKIX failure: invalid certificate parameters (33)
Отредактировано пользователем 13 августа 2015 г. 15:57:58(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Здравствуйте. Причины ошибки могут быть разные. Можете прикрепить цепочку сертификатов? Попробуйте запустить с настройкой: -Djava.security.debug=certpath Отредактировано пользователем 13 августа 2015 г. 16:04:47(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Автор: afev Здравствуйте. Причины ошибки могут быть разные. Можете прикрепить цепочку сертификатов?
Попробуйте запустить с настройкой: -Djava.security.debug=certpath запустила с -Djava.security.debug=certpath debug.txt (335kb) загружен 11 раз(а).
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Автор: afev Можете прикрепить цепочку сертификатов? С цепочкой не очень понимаю. Вообще, если открыть публичный сертификат, то в certification path указано 4 сертификата: непосредственно тот которым подписываю + УЦ ООО Сертум Про + УЦ 1 ИС ГУЦ + Головной удостоверяющий центр. При этом: Код:final KeyStore ks = KeyStore.getInstance(JCP.HD_STORE_NAME, JCP.PROVIDER_NAME);
ks.load(null, null);
cert = (X509Certificate) ks.getCertificate(keyName);
if (cert == null) {
throw new IllegalStateException("Certificate with alias: " + keyName + " not found");
}
certificateChain = ks.getCertificateChain(keyName);
длина certificateChain = 1
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
В lChain должна быть вся цепочка, как вы ее видите. Исключение - корневой сертификат, он должен лежать в cacerts. Если getCertificateChain дает 1 сертификат, значит, он один установлен в контейнер. Тогда остальные (промежуточные) тоже надо прочитать (из файлов, например) и добавить в lChain. Кроме того, у вас сертификаты с ключами вроде бы на алгоритме ГОСТ, а в addSigner вы подаете RSA, SHA и т.п. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Автор: afev В lChain должна быть вся цепочка, как вы ее видите. Исключение - корневой сертификат, он должен лежать в cacerts. Если getCertificateChain дает 1 сертификат, значит, он один установлен в контейнер. Тогда остальные (промежуточные) тоже надо прочитать (из файлов, например) и добавить в lChain. Кроме того, у вас сертификаты с ключами вроде бы на алгоритме ГОСТ, а в addSigner вы подаете RSA, SHA и т.п. Корневой сертификат лежит в cacerts, в lchain добавила промежуточные сертификаты (кроме корневого). Не могу понять как получить алгоритм хэширования и подписи. В деталях подписи вижу Sign algorithm GOST R 34.10-2001. То есть нужно использовать GOST_DIGEST_OID = "1.2.643.2.2.9" и GOST_EL_SIGN_OID = "1.2.643.2.2.3"? Если так, то все равно та же ошибка. Отредактировано пользователем 13 августа 2015 г. 19:09:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Посмотрите пример SignExample в пакете CAdES. В цепочке сертификатов есть кросс-сертификат? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Автор: afev Посмотрите пример SignExample в пакете CAdES. В цепочке сертификатов есть кросс-сертификат? Делаю как в примере SignExample: Код:public static byte[] createCAdESSignature(final byte[] data, final KeyStoreHolder keyStoreHolder, final List<Certificate> root) {
try {
// Включаем возможность онлайновой проверки.
System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "true");
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
final Collection<X509Certificate> chain = new ArrayList<>();
final List<Certificate> lChain = new ArrayList<>();
lChain.addAll(root);
lChain.addAll(Arrays.asList(keyStoreHolder.getCertificateChain()));
// Конвертируем цепочку в X509Certificate.
final Collection<X509Certificate> xChain =
Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
chain.addAll(xChain);
final PrivateKey privateKey = keyStoreHolder.getPrivateKey();
CAdESSignature cadesSignature = new CAdESSignature(false);
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null);
// Завершаем создание подписи с двумя подписантами.
byte[] cadesCms = cadesSignature.sign(data);
Array.writeFile("C:\\testsignature.txt", cadesCms);
Configuration.printSignatureInfo(cadesSignature);
return cadesCms;
} catch (Exception e) {
Configuration.printCAdESException(e);
return null;
}
}
В lChain лежит 3 сертификата: 1. "УЦ 1 ИС ГУЦ" 2. "УЦ ООО Сертум-Про" 3. сам сертификат, которым подписываю (не лежит только корневой сертификат "Головной удостоверяющий центр") Теперь ошибка исчезла и метод отрабатывает, но при проверке на гос услугах выдается ошибка: "Не найден сертификат подписи". Аналогичный результат получаю при проверке в коде: Код:final byte[] signedData = new Decoder().decodeBuffer(signatureData.getSignature());
final Asn1BerDecodeBuffer buffer = new Asn1BerDecodeBuffer(signedData);
final ContentInfo contentInfo = new ContentInfo();
contentInfo.decode(buffer);
final SignedData content = (SignedData) contentInfo.content;
final CertificateChoices[] certificates = content.certificates.elements;
content.certificates = null Отредактировано пользователем 14 августа 2015 г. 11:13:09(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Сертификат подписи надо добавить в подпись. У объекта класса CAdESSignature должен быть метод типа setCertificateStore, с помощью которого можно добавить store с сертификатом (-ми) для проверки. Этого метода, думаю, нет в CAdES.jar из JCP 1.0.54, но был позднее добавлен в JCP 2.0, однако тогда придется обновить JCP до 2.0. Кроме того, в CAdES 2.0 несколько изменился интерфейс CAdESSignature (см. CAdES-javadoc). Сертификат добавляется так: Код:
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
final Collection<X509CertificateHolder> signingCertHolderCollection =
Collections.singletonList(new X509CertificateHolder(signingCertificate.getEncoded())); // signingCertificate - сертификат подписи
final CollectionStore signingCertificateCollection =
new CollectionStore(signingCertHolderCollection);
CAdESSignature cAdESSignature = new CAdESSignature();
cAdESSignature.setCertificateStore(signingCertificateCollection); // добавляем сертификат подписи
cAdESSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID,
JCP.GOST_EL_KEY_OID, signingPrivateKey, chain, CAdESType.CAdES_BES, null, false); // подпись ключом signingPrivateKey, цепочка chain, подпись CAdES-BES
ByteArrayOutputStream outSignatureStream = new ByteArrayOutputStream();
cAdESSignature.open(outSignatureStream);
cAdESSignature.update(data); // передаем данные для подписи
cAdESSignature.close();
outSignatureStream.close();
byte[] sign = outSignatureStream.toByteArray(); // сформированная подпись
Также был расширен пример CMSSign в samples-sources.jar/CMS_samples, добавлено низкоуровневое создание CAdES-BES подписи. Отредактировано пользователем 14 августа 2015 г. 11:53:22(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.02.2015(UTC) Сообщений: 37 Откуда: Санкт-Петербург Сказал(а) «Спасибо»: 7 раз
|
Автор: afev Сертификат подписи надо добавить в подпись. У объекта класса CAdESSignature должен быть метод типа setCertificateStore, с помощью которого можно добавить store с сертификатом (-ми) для проверки. Этого метода, думаю, нет в CAdES.jar из JCP 1.0.54, но был позднее добавлен в JCP 2.0, однако тогда придется обновить JCP до 2.0. Кроме того, в CAdES 2.0 несколько изменился интерфейс CAdESSignature (см. CAdES-javadoc). Сертификат добавляется так: Код:
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
final Collection<X509CertificateHolder> signingCertHolderCollection =
Collections.singletonList(new X509CertificateHolder(signingCertificate.getEncoded())); // signingCertificate - сертификат подписи
final CollectionStore signingCertificateCollection =
new CollectionStore(signingCertHolderCollection);
CAdESSignature cAdESSignature = new CAdESSignature();
cAdESSignature.setCertificateStore(signingCertificateCollection); // добавляем сертификат подписи
cAdESSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID,
JCP.GOST_EL_KEY_OID, signingPrivateKey, chain, CAdESType.CAdES_BES, null, false); // подпись ключом signingPrivateKey, цепочка chain, подпись CAdES-BES
ByteArrayOutputStream outSignatureStream = new ByteArrayOutputStream();
cAdESSignature.open(outSignatureStream);
cAdESSignature.update(data); // передаем данные для подписи
cAdESSignature.close();
outSignatureStream.close();
byte[] sign = outSignatureStream.toByteArray(); // сформированная подпись
Также был расширен пример CMSSign в samples-sources.jar/CMS_samples, добавлено низкоуровневое создание CAdES-BES подписи. 1. Я использую jcp 1.0.54, так как версия сертифицирована. Насколько я понимаю версия 2.0 еще не сертифицирована, так? 2. Я попробовала подписать, как описано в примере (CMSSign в samples-sources.jar/CMS_samples - вариант CAdES_BES_SIGN). Метод отрабатывает, но при проверке на гос услугах ЭП не верна: Подлинность документа НЕ ПОДТВЕРЖДЕНА ЭП 1: НЕ ВЕРНА Статус сертификата подписи: Не проверялся Владелец : {данные из сертификата} Издатель: УЦ ООО «Сертум-Про» (Qualified), Служба ИТ, ООО «Сертум-Про», Екатеринбург, 66 Свердловская область, RU, ca@sertum-pro.ru, ул. Ульяновская д. 13А, 006673240328, 1116673008539 Действителен: с 2015.05.14 по 2016.05.14
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close