Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline vas239  
#1 Оставлено : 13 августа 2015 г. 15:51:43(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 13 августа 2015 г. 16:03:36(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Причины ошибки могут быть разные. Можете прикрепить цепочку сертификатов?

Попробуйте запустить с настройкой: -Djava.security.debug=certpath

Отредактировано пользователем 13 августа 2015 г. 16:04:47(UTC)  | Причина: Не указана

Offline vas239  
#3 Оставлено : 13 августа 2015 г. 16:15:53(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.02.2015(UTC)
Сообщений: 37
Российская Федерация
Откуда: Санкт-Петербург

Сказал(а) «Спасибо»: 7 раз
Автор: afev Перейти к цитате
Здравствуйте.
Причины ошибки могут быть разные. Можете прикрепить цепочку сертификатов?

Попробуйте запустить с настройкой: -Djava.security.debug=certpath


запустила с -Djava.security.debug=certpath debug.txt (335kb) загружен 11 раз(а).
Offline vas239  
#4 Оставлено : 13 августа 2015 г. 16:27:52(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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
Offline Евгений Афанасьев  
#5 Оставлено : 13 августа 2015 г. 16:59:40(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
В lChain должна быть вся цепочка, как вы ее видите. Исключение - корневой сертификат, он должен лежать в cacerts. Если getCertificateChain дает 1 сертификат, значит, он один установлен в контейнер. Тогда остальные (промежуточные) тоже надо прочитать (из файлов, например) и добавить в lChain.
Кроме того, у вас сертификаты с ключами вроде бы на алгоритме ГОСТ, а в addSigner вы подаете RSA, SHA и т.п.
Offline vas239  
#6 Оставлено : 13 августа 2015 г. 18:46:24(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Евгений Афанасьев  
#7 Оставлено : 14 августа 2015 г. 9:05:24(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Посмотрите пример SignExample в пакете CAdES. В цепочке сертификатов есть кросс-сертификат?
Offline vas239  
#8 Оставлено : 14 августа 2015 г. 11:02:54(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Евгений Афанасьев  
#9 Оставлено : 14 августа 2015 г. 11:41:44(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)  | Причина: Не указана

Offline vas239  
#10 Оставлено : 14 августа 2015 г. 13:27:43(UTC)
vas239

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
4 Страницы123>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.