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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Афанасьев  
#21 Оставлено : 14 ноября 2016 г. 16:12:17(UTC)
Евгений Афанасьев

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

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

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

java.lang.IllegalArgumentException: Hash or Sign ERROR:-2146434965
Нет доступа к карте. Введен неправильный PIN-код.

Приведите код, как подписываете.

Offline VBurmistrov  
#22 Оставлено : 14 ноября 2016 г. 16:17:25(UTC)
VBurmistrov

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

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

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

Я заранее инициализирую кэш с сертификатами и ключами

Код:
 KeyStore ks = KeyStore.getInstance(config.getProperty(Config.SIGN_KEYSTORE_TYPE), config.getProperty(Config.CRYPTO_PROVIDER));
        ks.load(null, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray());
        
        Enumeration<String> it = ks.aliases();
        
        while (it.hasMoreElements()) {
            String alias = it.nextElement();
            X509Certificate certificate = (X509Certificate) ks.getCertificate(alias);
            Key key = ks.getKey(alias, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray());
            PrivateKey privateKey = null;
            if (key != null) {
                privateKey = (PrivateKey) key;
            }
            signAttributesMap.putIfAbsent(alias, new Object[] {certificate, privateKey});
            LOGGER.log(Level.INFO, "Alias: " + alias);
        }


далее подпись выполняется с использованием ключей и сертификатов из этого кэша
Код:
Signature signature = Signature.getInstance("GOST3411withGOST3410DHEL", config.getProperty(Config.CRYPTO_PROVIDER));
        byte[] sign;
        
        // Формируем контекст подписи формата PKCS7.
        
        final ContentInfo ci = new ContentInfo();
        //            all.contentType = new Asn1ObjectIdentifier(
        //                    new OID(CMStools.STR_CMS_OID_SIGNED).value);
        ci.contentType = new Asn1ObjectIdentifier(
                new OID(STR_CMS_OID_SIGNED).value);
        
        final SignedData cms = new SignedData();
        ci.content = cms;
        cms.version = new CMSVersion(1);
        
        // Идентификатор алгоритма хеширования.
        
        cms.digestAlgorithms = new DigestAlgorithmIdentifiers(1);
        //            final DigestAlgorithmIdentifier a = new DigestAlgorithmIdentifier(
        //                    new OID(CMStools.DIGEST_OID).value);
        final DigestAlgorithmIdentifier digestAlgorithmIdentifier = new DigestAlgorithmIdentifier(
                new OID(OID_CMS_DIGEST).value);
        digestAlgorithmIdentifier.parameters = new Asn1Null();
        cms.digestAlgorithms.elements[0] = digestAlgorithmIdentifier;
        
        // Т.к. подпись отсоединенная, то содержимое отсутствует.
        
        //            cms.encapContentInfo = new EncapsulatedContentInfo(
        //                    new Asn1ObjectIdentifier(new OID(CMStools.STR_CMS_OID_DATA).value), null);
        cms.encapContentInfo = new EncapsulatedContentInfo(
                new Asn1ObjectIdentifier(new OID(STR_CMS_OID_DATA).value), null);
        
        // Добавляем сертификат подписи.
        
        cms.certificates = new CertificateSet(certificateList.size());
        cms.certificates.elements = new CertificateChoices[certificateList.size()];
        
        for (int i = 0; i < cms.certificates.elements.length; i++) {
            final ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate asnCertificate =
                    new ru.CryptoPro.JCP.ASN.PKIX1Explicit88.Certificate();
            
            final Asn1BerDecodeBuffer decodeBuffer =
                    new Asn1BerDecodeBuffer(certificateList.get(i).getEncoded());
            asnCertificate.decode(decodeBuffer);
            
            cms.certificates.elements[i] = new CertificateChoices();
            cms.certificates.elements[i].set_certificate(asnCertificate);
        }
        
        // Добавялем информацию о подписанте.
        cms.signerInfos = new SignerInfos(privateKeyList.size());
        
        for (int i = 0; i < cms.signerInfos.elements.length; i++) {
            
            cms.signerInfos.elements[i] = new SignerInfo();
            cms.signerInfos.elements[i].version = new CMSVersion(1);
            cms.signerInfos.elements[i].sid = new SignerIdentifier();
            
            final byte[] encodedName = certificateList.get(i).getIssuerX500Principal().getEncoded();
            final Asn1BerDecodeBuffer nameBuf = new Asn1BerDecodeBuffer(encodedName);
            final Name name = new Name();
            name.decode(nameBuf);
            
            final CertificateSerialNumber num = new CertificateSerialNumber(
                    certificateList.get(i).getSerialNumber());
            
            cms.signerInfos.elements[i].sid.set_issuerAndSerialNumber(
                    new IssuerAndSerialNumber(name, num));
            //            cms.signerInfos.elements[i].digestAlgorithm =
            //                    new DigestAlgorithmIdentifier(new OID(CMStools.DIGEST_OID).value);
            cms.signerInfos.elements[i].digestAlgorithm =
                    new DigestAlgorithmIdentifier(new OID(OID_CMS_DIGEST).value);
            cms.signerInfos.elements[i].digestAlgorithm.parameters = new Asn1Null();
            //            cms.signerInfos.elements[i].signatureAlgorithm =
            //                    new SignatureAlgorithmIdentifier(new OID(CMStools.SIGN_OID).value);
            cms.signerInfos.elements[i].signatureAlgorithm =
                    new SignatureAlgorithmIdentifier(new OID(OID_CMS_SIGN).value);
            cms.signerInfos.elements[i].signatureAlgorithm.parameters = new Asn1Null();
            
            //signedAttributes
            cms.signerInfos.elements[i].signedAttrs = new SignedAttributes(4);
            
            //-contentType
            int k = 0;
            cms.signerInfos.elements[i].signedAttrs.elements[k] =
                    new Attribute(OID_CMS_ATTR_CONTENT_TYPE.value,
                            new Attribute_values(1));
            
            final Asn1Type conttype = new Asn1ObjectIdentifier(STR_CMS_OID_DATA.value);
            
            cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = conttype;
            
            //time Attribute
            k += 1;
            cms.signerInfos.elements[i].signedAttrs.elements[k] = new Attribute(STR_CMS_OID_SIGN_TYM_ATTR.value, new Attribute_values(1));
            
            Time time = new Time();
            //        final Asn1GeneralizedTime genTime = new Asn1GeneralizedTime();
            //        //текущая дата с календаря
            //        genTime.setTime(Calendar.getInstance());
            //        time.set_generalTime(genTime);
            
            Asn1UTCTime UTCTime = new Asn1UTCTime();
            //текущая дата с календаря
            UTCTime.setTime(Calendar.getInstance());
            time.set_utcTime(UTCTime);
            
            cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] =
                    time.getElement();
            //--- time Attribute
            
            //-message digest
            k += 1;
            cms.signerInfos.elements[i].signedAttrs.elements[k] =
                    new Attribute(STR_CMS_OID_DIGEST_ATTR.value,
                            new Attribute_values(1));
            
            final byte[] messageDigestBlob;
            
            // Если вместо данных у нас хеш, то сразу его передаем, ничего не вычисляем.
            if (isExternalDigest) {
                messageDigestBlob = data;
            } // if
            else {
                messageDigestBlob = calculateDigestm(data, "GOST3411", config.getProperty(Config.CRYPTO_PROVIDER));
            }
            
            final Asn1Type messageDigest = new Asn1OctetString(messageDigestBlob);
            
            cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = messageDigest;
            
            if (true) {
                // Собственно, аттрибут с OID'ом id_aa_signingCertificateV2.
                k += 1;
                cms.signerInfos.elements[i].signedAttrs.elements[k] =
                        new Attribute(new OID(ALL_PKIX1Explicit88Values.id_aa_signingCertificateV2).value,
                                new Attribute_values(1));
                
                // Идентификатор алгоритма хеширования, который использовался для
                // хеширования контекста сертификата ключа подписи.
                final DigestAlgorithmIdentifier a =
                        new DigestAlgorithmIdentifier(new OID(JCP.GOST_DIGEST_OID).value);
                
                // Хеш сертификата ключа подписи.
                final CertHash certHash = new CertHash(
                        calculateDigestm(certificateList.get(i).getEncoded(), "GOST3411", config.getProperty(Config.CRYPTO_PROVIDER)));
                
                // Issuer name из сертификата ключа подписи.
                GeneralName generalName = new GeneralName();
                generalName.set_directoryName(name);
                
                GeneralNames generalNames = new GeneralNames();
                generalNames.elements = new GeneralName[1];
                generalNames.elements[0] = generalName;
                
                // Комбинируем издателя и серийный номер.
                IssuerSerial issuerSerial = new IssuerSerial(generalNames, num);
                
                ESSCertIDv2 essCertIDv2 =
                        new ESSCertIDv2(a, certHash, issuerSerial);
                
                _SeqOfESSCertIDv2 essCertIDv2s = new _SeqOfESSCertIDv2(1);
                essCertIDv2s.elements = new ESSCertIDv2[1];
                essCertIDv2s.elements[0] = essCertIDv2;
                
                // Добавляем сам аттрибут.
                SigningCertificateV2 signingCertificateV2 = new SigningCertificateV2(essCertIDv2s);
                cms.signerInfos.elements[i].signedAttrs.elements[k].values.elements[0] = signingCertificateV2;
                
            } // if
            
            //signature
            Asn1BerEncodeBuffer encBufSignedAttr = new Asn1BerEncodeBuffer();
            cms.signerInfos.elements[i].signedAttrs
                    .encode(encBufSignedAttr);
            final byte[] hsign = encBufSignedAttr.getMsgCopy();
            signature.initSign(privateKeyList.get(i));
            signature.update(hsign);
            sign = signature.sign();
            
            cms.signerInfos.elements[i].signature = new SignatureValue(sign);




Offline Евгений Афанасьев  
#23 Оставлено : 14 ноября 2016 г. 16:20:15(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Автор: VBurmistrov Перейти к цитате
Key key = ks.getKey(alias, config.getProperty(Config.SIGNATURE_CREDENTIAL).toCharArray());

Попробуйте использовать
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password))
PrivateKey privateKey = entry.getPrivateKey()
с заданием пароля вместо getKey.
В случае getKey() с JCSP ввод пароля будет осуществлен при обращении к ключу для подписи (в окне или консоли).

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

Offline VBurmistrov  
#24 Оставлено : 14 ноября 2016 г. 16:26:44(UTC)
VBurmistrov

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

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

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

В случае JCSP ввод пароля будет осуществлен при обращении к ключу для подписи (в окне или консоли).


А так, чтобы пароль кэшировался и не нужно было его вводить при каждом обращении, так возможно с JCSP? Можно ли это настроить в CSP по аналогии с Windows версией, где галочка Хранить ключи в памяти приложений
Offline Евгений Афанасьев  
#25 Оставлено : 14 ноября 2016 г. 16:38:33(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Автор: afev Перейти к цитате
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password))
PrivateKey privateKey = entry.getPrivateKey()

Этот вариант не подходит?

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
VBurmistrov оставлено 14.11.2016(UTC)
Offline VBurmistrov  
#26 Оставлено : 14 ноября 2016 г. 17:29:04(UTC)
VBurmistrov

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 7 раз в 5 постах
Автор: afev Перейти к цитате
Автор: afev Перейти к цитате
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry)keyStore.getEntry(alias, new JCPProtectedParameter(password))
PrivateKey privateKey = entry.getPrivateKey()

Этот вариант не подходит?



Спасибо большое! Таким образом есть доступ к ключам, подпись вырабатывается! Проверил на JCP и на Java CSP!
Хотя на первый взгляд визуально объект такой же.

Правда у меня теперь появился другой вопрос к JCSP Angel - подпись на XML не работает, выдает:

Код:
org.apache.xml.security.signature.XMLSignatureException: Unsupported method.
Original Exception was java.security.SignatureException: Unsupported method.


Тот же самый метод с провайдером JCP работает, подпись валидируется.

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

Offline Евгений Афанасьев  
#27 Оставлено : 14 ноября 2016 г. 17:32:30(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Нужен полный стек ошибки. Предположу, что где-то вызывается XXX.getInstance(algorithm) без указания провайдера, при этом ключ - JCSP, а алгоритм, например, подписи - JCP. В getInstance помимо алгоритма должен быть указан провайдер, его реализующий (JCP не создаст подпись с ключом, полученным с помощью JCSP, например, и наоборот).

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

Offline Евгений Афанасьев  
#28 Оставлено : 14 ноября 2016 г. 17:39:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Пожалуй, было бы лучше перенести беседу в портал техподдержки.
Offline VBurmistrov  
#29 Оставлено : 14 ноября 2016 г. 17:55:34(UTC)
VBurmistrov

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

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

Сказал(а) «Спасибо»: 5 раз
Поблагодарили: 7 раз в 5 постах
Автор: afev Перейти к цитате
Нужен полный стек ошибки. Предположу, что где-то вызывается XXX.getInstance(algorithm) без указания провайдера, при этом ключ - JCSP, а алгоритм, например, подписи - JCP. В getInstance помимо алгоритма должен быть указан провайдер, его реализующий (JCP не создаст подпись с ключом, полученным с помощью JCSP, например, и наоборот).




Я использую org.apache.xml.security.signature.XMLSignature, там явно провайдер не указываю.
Просто поменял местами в java.security
security.provider.10=ru.CryptoPro.JCSP.JCSP
security.provider.11=ru.CryptoPro.JCP.JCP

И все пошло.
Спасибо!
Да обязательно зарегистрируюсь на портале техподдержки.
Offline miki1988  
#30 Оставлено : 13 февраля 2017 г. 16:54:23(UTC)
miki1988

Статус: Новичок

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

Не получается добавить сертификат в Ubuntu 16.04.
Скопировал 6 ключей в папку /var/opt/cprocsp/keys/user/cf77013d.000
Команда csptest -keyset -enum_cont -verifycontext -fqcn выдает следующее:
Код:

CSP (Type:80) v4.0.9014 KC1 Release Ver:4.0.9842 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 14611219
\\.\HDIMAGE\cf77013d-e7t0-4f37-9619-02d404a7j9a5
OK.
Total: SYS: 0,010 sec USR: 0,050 sec UTC: 0,150 sec
[ErrorCode: 0x00000000]


При попытке добавить сертификат certmgr -inst -store uMy -file bc_242087.cer -cont '\\.\HDIMAGE\cf77013d-e7t0-4f37-9619-02d404a7j9a5' выдает ошибку:
Код:

Certmgr 1.0 (c) "CryptoPro",  2007-2010.
program for managing certificates, CRLs and stores

Invalid data in file bc_242087.cer

An error occurred while reading or writing to a file.
[ErrorCode: 0x80092003]

В чем может быть проблема?

Отредактировано пользователем 13 февраля 2017 г. 16:55:23(UTC)  | Причина: Не указана

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