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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Michaell  
#1 Оставлено : 8 октября 2019 г. 9:58:31(UTC)
Michaell

Статус: Участник

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

Добрый день

При получении подписи происходит ошибка: PKIX failure: invalid parameters of certificate
Цепочку сертификатов проверил:
Код:

@Test
    public void test() throws Exception {


        System.setProperty("com.sun.security.enableCRLDP", "true"); // для проверки по CRL DP
        System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
        System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети


        final CertificateFactory cf = CertificateFactory.getInstance("X509");

        final Certificate user = cf.generateCertificate(new FileInputStream("F:\\certificats\\cert.cer"));
        Certificate root = cf.generateCertificate(new FileInputStream("F:\\certificats\\certC.cer"));

        final Certificate[] certs = new Certificate[2];
        certs[0] = user;
        certs[1] = root;

        final Set<TrustAnchor> trust = new HashSet<>(1);
        trust.add(new TrustAnchor((X509Certificate) root, null));

        final List cert = new ArrayList(0);
        for (int i = 0; i < certs.length; i++)
            cert.add(certs[i]);

        final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
        cpp.setSigProvider(null);

        final CollectionCertStoreParameters par =
                new CollectionCertStoreParameters(cert);

        final CertStore store = CertStore.getInstance("Collection", par);
        cpp.addCertStore(store);

        final X509CertSelector selector = new X509CertSelector();
        selector.setCertificate((X509Certificate) user);

        cpp.setTargetCertConstraints(selector);
        cpp.setRevocationEnabled(false);

        // Построение цепочки.

        final PKIXCertPathBuilderResult res =
                (PKIXCertPathBuilderResult) CertPathBuilder.
                        getInstance("CPPKIX", "RevCheck").build(cpp);

        final CertPath cp = res.getCertPath();

        System.out.println("%%% SIZE: " + cp.getCertificates().size());
        //System.out.println("%%% PATH:\n" + cp);
        System.out.println("OK-1");

        // Проверка цепочки.

        final CertPathValidator cpv = CertPathValidator.getInstance("CPPKIX", "RevCheck");
        cpp.setRevocationEnabled(true);

        cpv.validate(cp, cpp);
        System.out.println("OK-2");
}

Результат:

%%% SIZE: 1
OK-1
OK-2

Вот код получения подписи:
Код:

    @Test

    public void testCertificate()
            throws CAdESException, KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, CertificateException, IOException, InvalidAlgorithmParameterException, NoSuchProviderException, CertPathBuilderException {

        final Logger LOG = LoggerFactory.getLogger(ru.CryptoPro.JCP.tools.JCPLogger.class);

        System.setProperty( "com.sun.security.enableCRLDP", "true" );
        System.setProperty( "com.ibm.security.enableCRLDP", "true" );

        String data = ""; //получение кода для авторизации
        String alias = "XXXXXXXXX";
        char[] password = {'1', '2', '3', '4'};
        boolean detached = false;
        // false - прикреплённая(для получения токена авторизации) подпись
        // true - откреплённая(для подписания документов) подпись
        //Формирование подписи

        Security.addProvider(new JCP());

        KeyStore keyStore = KeyStore.getInstance(JCP.HD_STORE_NAME);//KeyStore.getInstance("2DA1");////loadKeyStore();//инициализация хранилища ключей
        keyStore.load(null, null);

        List<X509CertificateHolder> chain = new ArrayList<>();

        //List<java.security.cert.Certificate> certs = Arrays.asList(keyStore.getCertificateChain(alias));

        //System.setProperty("com.sun.security.enableCRLDP", "true"); // для проверки по CRL DP
        //System.setProperty("com.sun.security.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети
        //System.setProperty("ru.CryptoPro.reprov.enableAIAcaIssuers", "true"); // для загрузки сертификатов по AIA из сети


        final CertificateFactory cf = CertificateFactory.getInstance("X509");
        final Certificate user = cf.generateCertificate(new FileInputStream("F:\\ua\\certificats\\cert.cer"));
        Certificate root = cf.generateCertificate(new FileInputStream("F:\\ua\\certificats\\certC.cer"));

        final Certificate[] certs = new Certificate[2];
        certs[0] = user;
        certs[1] = root;

        final Set<TrustAnchor> trust = new HashSet<>(1);
        trust.add(new TrustAnchor((X509Certificate) root, null));

        final List<Certificate> certs_ = new ArrayList(0);
        for (int i = 0; i < certs.length; i++)
            certs_.add(certs[i]);

        final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
        cpp.setSigProvider(null);

        final CollectionCertStoreParameters par =
                new CollectionCertStoreParameters(certs_);

        final CertStore store = CertStore.getInstance("Collection", par);
        cpp.addCertStore(store);

        final X509CertSelector selector = new X509CertSelector();
        selector.setCertificate((X509Certificate) user);

        cpp.setTargetCertConstraints(selector);
        cpp.setRevocationEnabled(false);

        final PKIXCertPathBuilderResult res =
                (PKIXCertPathBuilderResult) CertPathBuilder.
                        getInstance("CPPKIX", "RevCheck").build(cpp);

        final CertPath cp = res.getCertPath();

        System.out.println("%%% SIZE: " + cp.getCertificates().size());
        System.out.println("%%% PATH:\n" + cp);

        ///////

        certs_.forEach(cert -> {
            try {
                chain.add(new X509CertificateHolder(cert.getEncoded()));
            } catch (IOException | CertificateEncodingException e) {
                //log.error("Error while building certificate chain", e);
                System.err.println("Error while building certificate chain " + e.getMessage());
            }
        });
        PrivateKey privateKey = (PrivateKey) (keyStore.getKey(alias, password));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        CAdESSignature signature = new CAdESSignature(detached);
        signature.setCertificateStore(new CollectionStore(chain));
        final Hashtable table = new Hashtable();
        Attribute attr = new Attribute(CMSAttributes.signingTime,
                new DERSet(new Time(new Date()))); // устанавливаем время подписи
        table.put(attr.getAttrType(), attr);
        AttributeTable attrTable = new AttributeTable(table);
        //Добавление подписанта. Алгоритмы могут отличаться в зависимости от требований


        signature.addSigner(JCP.PROVIDER_NAME,
                JCP.GOST_DIGEST_2012_256_OID,
                JCP.GOST_PARAMS_EXC_2012_256_KEY_OID,
                privateKey,
                certs_,
                CAdESType.CAdES_BES,
                null,
                false,
                attrTable,
                null);
        signature.open(out);
        signature.update(data.getBytes());
        signature.close();
        byte[] signedCode = out.toByteArray();
    }/**/


Где ошибка ?
Offline Евгений Афанасьев  
#2 Оставлено : 8 октября 2019 г. 10:20:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
1. К чему длинная часть про построение перед addSigner? Этот метод построит цепочку сам и проверит, ему надо только дать сертификаты (первым, если не ошибаюсь, должен быть сертификат подписи).
2. Включите логирование JCPLogger уровня ALL, см. https://support.cryptopr...nlirovnija-kriptopro-jcp
3. Приложите лог после ошибки.
Offline Michaell  
#3 Оставлено : 8 октября 2019 г. 12:57:53(UTC)
Michaell

Статус: Участник

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

Прикладываю лог

Отредактировано пользователем 9 октября 2019 г. 11:03:27(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 8 октября 2019 г. 15:44:06(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Приложите, пожалуйста, клиентский сертификат.
Offline Michaell  
#5 Оставлено : 8 октября 2019 г. 15:59:24(UTC)
Michaell

Статус: Участник

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

Сертификат

Отредактировано пользователем 9 октября 2019 г. 10:46:12(UTC)  | Причина: Не указана

Offline Michaell  
#6 Оставлено : 9 октября 2019 г. 10:44:17(UTC)
Michaell

Статус: Участник

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

Есть какие-то рекомендации ?
Offline Евгений Афанасьев  
#7 Оставлено : 9 октября 2019 г. 12:28:57(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Вы, вероятно, в вашем примере, состоящем из двух частей: отдельно построение и отдельно подпись, проверяете подпись раздельно, и для первой части у вас задается enableAIAcaIssuers, а для случая cades-подписи - нет. В случае enableAIAcaIssuers промежуточный сертификат скачивается и цепочка строится (1 часть примера), для второй части вы, вероятно, комментируете enableAIAcaIssuers и cades-подпись запускается без enableAIAcaIssuers, цепочка не строится. Задавайте везде enableAIAcaIssuers, если не передаете промежуточные в addSigner.
Кроме того, в последних версиях cades.jar у одного из методов addSigner (самого полного) есть параметр addCertificateChain, который означает добавление построенной цепочки в подпись.
Offline Michaell  
#8 Оставлено : 9 октября 2019 г. 13:57:42(UTC)
Michaell

Статус: Участник

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

Спасибо
Offline BlackDox  
#9 Оставлено : 25 марта 2020 г. 13:48:21(UTC)
BlackDox

Статус: Участник

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

Подскажите, а как-то можно задать проверку crl для PKIXBuilderParameters (params.setSigProvider("JCP")) - оффлайн через файл .crl ?
Offline Евгений Афанасьев  
#10 Оставлено : 25 марта 2020 г. 15:08:23(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Офлайн загруженные файлы crl можно передать в addSigner при создании или в verify при проверке.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
ВадимPilotnikov оставлено 29.11.2022(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.