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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline t1nk  
#1 Оставлено : 12 сентября 2016 г. 16:54:07(UTC)
t1nk

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

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

Сказал(а) «Спасибо»: 7 раз
Здравствуйте!

Читая форум, я так и не понял почему не получается создать отделенную подпись.

Код:
final tring data = "string";
final byte src[] = data.getBytes();

KeyStore keyStore = KeyStore.getInstance( "HDImageStore" );
//KeyStore keyStore = KeyStore.getInstance( "RutokenStore" );
keyStore.load( null, null );
PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
//List<Certificate> chain = Arrays.asList( keyStore.getCertificateChain( cer_alias ) );
List<X509Certificate> chain = Arrays.asList( cert );

CAdESSignature cadesSignature = new CAdESSignature( true );
// Создаем подписанта CAdES-BES.
cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );
// Будущая подпись в виде массива.
ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
// Подготовка контекста.
cadesSignature.open( signatureStream );
// Хеширование.
cadesSignature.update( src );
// Создание подписи с выводом в signatureStream.
cadesSignature.close();
signatureStream.close();
// Получаем подпись с двумя подписантами в виде массива.
byte[] cadesCms = signatureStream.toByteArray();

return toHexString( cadesCms );

Валится на строке:
Код:
cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );

с ошибкой:
Код:
Caused by: Error building certification path for C=RU, ...... : ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate', 
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.com.test.api.Smev2.signdata(Smev2.java:157)
	... 15 more
Caused by: Error building certification path for C=RU, ...... : ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate', 
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
	... 19 more


Пытался сделать по аналогии с "Создание и проверка отделенной подписи в Browser Plug-in" (http://cpdn.cryptopro.ru...mples-sign-detached.html),
по примерам CAdES\SignExample.java (1.0.54) и CAdES\SignExample.java (2.0). С последним вообще не разобрался - куча универсального кода, который сложно разбирать, поэтому ориентировался на первый.

Используется JCP 2.0.38830. Сертификат действительно находится в HDImageStore.

Другой код по этим же данным и ключу отрабатывает:
Код:
String AlgSign = JCP.CRYPTOPRO_SIGN_NAME;
Signature sig = Signature.getInstance( AlgSign );
sig.initSign( privateKey );
sig.update( src );
byte[] signature = sig.sign();
return toHexString( signature );


В каком из параметров проблемной строки я... хм... ошибся ?
Online Евгений Афанасьев  
#2 Оставлено : 12 сентября 2016 г. 17:12:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Код:

Caused by: Error building certification path for C=RU, ...... : ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate', 
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)


Корневой сертификат установлен в cacerts? Если есть промежуточные, то они подаются в addSigner?
В коде с Signature нет проверки цепочки. Можно подавать и просто открытый ключ.

Отредактировано пользователем 12 сентября 2016 г. 17:13:09(UTC)  | Причина: Не указана

Offline t1nk  
#3 Оставлено : 13 сентября 2016 г. 10:38:23(UTC)
t1nk

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

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

Сказал(а) «Спасибо»: 7 раз
Добавил корневой сертификат в cacerts под алиасом "cryptopro2".
Сам используемый сертификат выдан вашим тестовым центром, промежуточных вроде бы нет.
На всякий случай добавил этот корневой сертификат ещё и виндовый реестр сертификатов.

Тем не менее все равно получаю ошибку на той же строке:
Код:
--- exec-maven-plugin:1.2.1:exec (default-cli) @ TestCryptoPro2 ---
сен 13, 2016 11:19:53 AM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0 38830
сен 13, 2016 11:19:53 AM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
сен 13, 2016 11:19:53 AM ru.CryptoPro.CAdES.tools.CAdESUtility initJCPAlgorithms
INFO: Replacement of the BouncyCastle GOST algorithms.
Oid or private key is null; error codes: [-2] 'Application error', 
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.com.testcryptopro2.SignerData.signed(SignerData.java:43)
	at ru.com.testcryptopro2.Main.main(Main.java:7)
Caused by: Oid or private key is null; error codes: [-2] 'Application error', 
	at ru.CryptoPro.AdES.tools.AdESUtility.checkOidAndKeyAlgorithmCompatibility(Unknown Source)
	... 5 more


Полный код тестового проекта:

Код:
package ru.com.testcryptopro2;

public class Main {

    public static void main( String[] args ) throws Exception {
        try {
            String result = SignerData.signed( "string" );
            System.out.print( result );
        } catch ( Exception ex ) {
            ex.printStackTrace();
        }
    }
}

Код:
package ru.com.testcryptopro2;

import java.io.*;
import java.security.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.*;

import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESSigner;
import ru.CryptoPro.CAdES.CAdESType;
import ru.CryptoPro.CAdES.exception.*;

public class SignerData {

    final static private String cer_story = "HDImageStore";
    //final static private String cer_story = "RutokenStore";
    final static private String cer_alias = "cpstestcont";
    final static private String cer_pass_str = "12345678";
    final static private char[] cer_pass = cer_pass_str.toCharArray();

    static public String signed(String data) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, CAdESException, InvalidKeyException, SignatureException {
        final byte src[] = data.getBytes();

        KeyStore keyStore = KeyStore.getInstance( cer_story );
        keyStore.load( null, null );
        PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
        X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
        //List<Certificate> chain = Arrays.asList( keyStore.getCertificateChain( cer_alias ) );
        List<X509Certificate> chain = Arrays.asList( cert );

        /*
        String AlgSign = JCP.CRYPTOPRO_SIGN_NAME;
        Signature sig = Signature.getInstance( AlgSign );
        sig.initSign( privateKey );
        sig.update( src );
        byte[] signature = sig.sign();
        return toHexString( signature );
        */

        CAdESSignature cadesSignature = new CAdESSignature( true );
        // Создаем подписанта CAdES-BES.
        cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );
        // Будущая подпись в виде массива.
        ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
        // Подготовка контекста.
        cadesSignature.open( signatureStream );
        // Хеширование.
        cadesSignature.update( src );
        // Создание подписи с выводом в signatureStream.
        cadesSignature.close();
        signatureStream.close();
        // Получаем подпись в виде массива.
        byte[] cadesCms = signatureStream.toByteArray();

        return toHexString( cadesCms );
    }

    public static String toHexString( byte[] array ) {
        final char[] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        StringBuffer ss = new StringBuffer( array.length * 3 );
        for ( int i = 0; i < array.length; i++ ) {
            ss.append( hex[(array[i] >>> 4) & 0xf] );
            ss.append( hex[array[i] & 0xf] );
        }
        return ss.toString();
    }
}

При этом приватный ключ и получены:
Screenshot_18.png (80kb) загружен 77 раз(а).

Проблема может быть в коде (каких-то ещё параметров не хватает) или в окружении ?


PS
Ориентируясь на примеры документации "CAdES" (хотя там только примеры проверки или модификации уже созданной подписи...) модификация проблемной строки
Код:
cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );

в следующею
Код:
cadesSignature.addSigner( "HDImageStore", JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKey, chain, CAdESType.CAdES_BES, null, false );

приводит к изменению ошибки на:
Код:
Error building certification path for C=RU,  ... : ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate', 
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.com.testcryptopro2.SignerData.signed(SignerData.java:43)
	at ru.com.testcryptopro2.Main.main(Main.java:7)
Caused by: Error building certification path for C=RU, ST=Белгородская область,  ... : ru.CryptoPro.reprov.certpath.JCPCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate', 
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source)
	... 4 more



PS2
Использование строки
Код:
List<Certificate> chain = Arrays.asList( keyStore.getCertificateChain( cer_alias ) );

вместо
Код:
List<X509Certificate> chain = Arrays.asList( cert );

ничего не меняет.

В смысле ошибки при обоих вариантах проблемной строки те же.

Возможно я неправильно установил сертификат?
Цитата:
C:\Program Files\Java\jdk1.7.0_21\jre\lib\security>keytool -keystore cacerts -importcert -alias cryptopro2 -file cryptoProTestCenter.cer

Это самоподписанный сертификат "CRYPTO-PRO Test Center 2"...

Отредактировано пользователем 13 сентября 2016 г. 11:19:08(UTC)  | Причина: дополнение поста: PS, PS2

Online Евгений Афанасьев  
#4 Оставлено : 13 сентября 2016 г. 12:04:13(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
1. У вас HDImageStore в качестве провайдера в addSigner. Это поле "провайдер", т.е. "JCP".
2. После исправления, думаю, вы получите ошибку "Error building certification path". Включите полное логирование (https://support.cryptopro.ru/index.php?/Knowledgebase/Article/View/45/6/vkljuchenie-zhurnlirovnija-kriptopro-jcp), приложите лог.

Отредактировано пользователем 13 сентября 2016 г. 12:05:08(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
t1nk оставлено 13.09.2016(UTC)
Offline t1nk  
#5 Оставлено : 13 сентября 2016 г. 12:33:37(UTC)
t1nk

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

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

Сказал(а) «Спасибо»: 7 раз
Изменил строку
Код:
"HDImageStore"   ==>   JCP.PROVIDER_NAME

Действительно получил ошибку, но другую:
Код:
Parameter 'com.sun.security.enableCRLDP' or 'com.ibm.security.enableCRLDP' must be set 'true' to enable CRL check or 'ocsp.enable' must be set 'true' to enable OCSP check; error codes: [44] 'Certificate status is unknown or revoked', 
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.CryptoPro.CAdES.g.addSigner(Unknown Source)
	at ru.com.testcryptopro2.SignerData.signed(SignerData.java:44)
	at ru.com.testcryptopro2.Main.main(Main.java:7)
Caused by: Parameter 'com.sun.security.enableCRLDP' or 'com.ibm.security.enableCRLDP' must be set 'true' to enable CRL check or 'ocsp.enable' must be set 'true' to enable OCSP check; error codes: [44] 'Certificate status is unknown or revoked', 
	at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source)
	at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source)
	at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source)
	... 4 more
Caused by: Parameter 'com.sun.security.enableCRLDP' or 'com.ibm.security.enableCRLDP' must be set 'true' to enable CRL check or 'ocsp.enable' must be set 'true' to enable OCSP check; error codes: [30] 'Calling a remote service failed', 
	... 7 more


В архиве 4 полных лога с видом проблемной строки:

  1. cadesSignature.addSigner( "HDImageStore", privateKey, chain, CAdESType.CAdES_BES, null, false );
  2. cadesSignature.addSigner( "HDImageStore", JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKey, chain, CAdESType.CAdES_BES, null, false );
  3. cadesSignature.addSigner( JCP.PROVIDER_NAME, privateKey, chain, CAdESType.CAdES_BES, null, false );
  4. cadesSignature.addSigner( JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKey, chain, CAdESType.CAdES_BES, null, false );


PS
Если в класс SignerData добавляю (найдено на просторах форума):
Код:
static {
    // Включаем возможность онлайновой проверки.
    System.setProperty( "com.sun.security.enableCRLDP", "true" );
    System.setProperty( "com.ibm.security.enableCRLDP", "true" );
}

То ошибка наконец пропадает...
Но я не понимаю, что это за онлайновая проверка такая...
И можно ли обойтись без неё?

Отредактировано пользователем 13 сентября 2016 г. 14:21:42(UTC)  | Причина: добавлено уточнение

Online Евгений Афанасьев  
#6 Оставлено : 13 сентября 2016 г. 13:25:29(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Автор: t1nk Перейти к цитате
Но я не понимаю, что это за онлайновая проверка такая...
И можно ли обойтись без неё?

Проверка цепочки сертификатов по адресам CRLDP в сертификатах. Отключить ее нельзя.

Offline t1nk  
#7 Оставлено : 13 сентября 2016 г. 16:04:56(UTC)
t1nk

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

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

Сказал(а) «Спасибо»: 7 раз
То есть нет возможности использовать оффлановую проверку ?
Online Евгений Афанасьев  
#8 Оставлено : 13 сентября 2016 г. 16:46:11(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
При создании подписи пока только проверка онлайн, при проверке подписи можно в verify передать CRL.
Offline VBurmistrov  
#9 Оставлено : 27 сентября 2016 г. 9:49:11(UTC)
VBurmistrov

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 7 раз в 5 постах
Здравствуйте!

Столкнулся немного с другой проблемой.
С помощью КриптоПРО JCP 2.08 ставлю detached подпись.
Действую фактически,как в примере в классе CMSSign в методе createHashCMSEx "Создание сообщения с подписью на хэш signedAttibutes."
На том же КриптоПРО JCP эту подпись проверяю, хэш данных совпадает, атрибуты на месте и подпись этих атрибутов валидна,
Смотрю файл подписи в ASN.1 View, ничего странного на первый взгляд нет, т.е. все нормально.

Но попробовал проверить эту же подпись в КриптоАРМ Стандарт Плюс 5 (5.4.0.9079) и там получаю результат - "Подпись недействительна или не установлен криптопровайдер (не вставлен токен)"

Криптопровайдер КриптоПро CSP 3.9.800 у меня установлен, все с лицензиями. И КриптоАРМ в настройках видит этот криптопровайдер. Подписи сделанные в КриптоАРМ на том же ключе, в нем же проверяются. Почему не проверяется подпись от КриптоПро JCP, кто нибудь сталкивался. Подскажите, пожалуйста, в чем может быть дело?

ВОПРОС СНЯТ (ответ ниже)

Отредактировано пользователем 27 сентября 2016 г. 14:29:22(UTC)  | Причина: Не указана

Offline VBurmistrov  
#10 Оставлено : 27 сентября 2016 г. 14:28:41(UTC)
VBurmistrov

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 7 раз в 5 постах
Коллеги, вопрос снят! Извиняюсь за шум.
Все работает, я перемудрил с OID-ами при формировании подписи.
Нужно быть внимательнее с OID -ами атрибутов и их значений.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.