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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline crazz  
#1 Оставлено : 29 декабря 2021 г. 11:46:07(UTC)
crazz

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

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

Сказал(а) «Спасибо»: 3 раз
добрый день, может кто то сталкивался и есть рабочее решение:
проблема воспроизводится на Win Server 2012 R2 Standart
(на Win10 Professional - работает)

окружение JCSP 5.0.42109, CSP 5.0.12330, служба кеширования ключей


сценарий кеширования в хранилище MY (Personal)
сертификаты с носителя (вирт дискеты) устанавливаются в Личные
для кеширования приватного ключа - средствами CSP делаем попытку поменять пароль,
проверяем подписание в CSP - ок
отключаем носитель
еще раз проверяем подписание в CSP - ок

запускаем java приложение, пробуем в нем подписать - первая вторая попытки работают нормально, подписывается,
а после начинается непонятное - следующая попытка выдает ошибку
Код:
java.lang.IllegalArgumentException: Hash or Sign ERROR: 0x57
	at ru.CryptoPro.JCSP.MSCAPI.MSHashNSignException.procCode(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.createHash(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.a(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.initHashGR3411(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_4.a(Unknown Source)
	at ru.CryptoPro.JCSP.Key.AbstractKeySpec.prepareHash(Unknown Source)
	at ru.CryptoPro.JCSP.Digest.BaseGostDigest.prepare(Unknown Source)
	at ru.CryptoPro.JCSP.Digest.BaseGostDigest.engineUpdate(Unknown Source)
	at ru.CryptoPro.JCSP.Sign.CryptoProSign.engineUpdate(Unknown Source)
	at java.security.Signature.update(Unknown Source)
	at java.security.Signature.update(Unknown Source)
	at ru.soi.service.crypto.SigningService.signAndVerify(SigningService.java:159)
	at ru.soi.service.crypto.SigningService.signingFile(SigningService.java:268)
	at ru.soi.controller.v1.signature.SignatureServiceController.normalSignFile(SignatureServiceController.java:247)
	at ru.soi.controller.v1.signature.SignatureServiceController$$FastClassBySpringCGLIB$$e441f2bc.invoke(<generated>)


а следующая попытка снова подписывает без ошибок

проблема - подписание работает не стабильно, и куда копать не понятно
код

Код:


            FileAsByteArrayManager fileAsByteArrayManager = new FileAsByteArrayManager();
            byte[] fileInByte = fileAsByteArrayManager.readfileAsBytes(inFile);
            byte[] signInByte = signAndVerify(JCP.GOST_SIGN_2012_256_NAME, alias,
                    "".toCharArray(), cryptoParams.getAsk_pin_in_window(), fileInByte);

            String fileNameSig = inFile.getAbsolutePath() + ".sig";
            fileAsByteArrayManager.writeFile(signInByte, fileNameSig);
            return fileNameSig;


 public byte[] signAndVerify(String signAlgName, String alias,
                                char[] password, boolean askPinInWindow, byte[] fileInByte) throws Exception {

        KeyStore keyStore = getKS(alias);

        PrivateKey privateKey;
        PublicKey publicKey;
        Certificate certificate;

// askPinInWindow = true
        if (askPinInWindow) {
            privateKey = (PrivateKey) keyStore.getKey(alias, null);
            certificate = keyStore.getCertificate(alias);
            publicKey = certificate.getPublicKey();
        } else {
            KeyStore.ProtectionParameter protectedParam =
                    new KeyStore.PasswordProtection(password);
            JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(alias, protectedParam);
            privateKey = entry.getPrivateKey();
            certificate = entry.getCertificate();
            publicKey = certificate.getPublicKey();
        }
        if (isNull(privateKey)) throw new NotFoundException("not found private key for alias: " + alias);
        Signature signer = Signature.getInstance(signAlgName, JCSP.PROVIDER_NAME);

        signer.initSign(privateKey);
        signer.update(fileInByte);

        byte[] signature = signer.sign();

        Encoder encoder = new Encoder();
        log.info("Signature: " + encoder.encode(signature));

        Signature validator = Signature.getInstance(signAlgName, JCSP.PROVIDER_NAME);
        validator.initVerify(publicKey);
        validator.update(fileInByte);

        boolean valid = validator.verify(signature);
        log.info("Signature verified: " + valid);
        if (!valid)
            throw new Exception();
        signature = (new SignatureChecker()).cmsSignature((X509Certificate) certificate, signature);

        return signature;
    }

    public static KeyStore getKS(String alias) throws Exception {
        // только хранилище MY
        KeyStoreConfig.getInstance().getNames();
        KeyStore store = KeyStore.getInstance(MY, JCSP.PROVIDER_NAME);
        store.load(null, null);
        Object c = store.getCertificate(alias);
        if (null != c) {
            log.info(MY);
            return store;
        }
        throw new Exception("no store found for " + alias);
    }

Offline azxsdcvfjk  
#2 Оставлено : 12 января 2022 г. 20:23:27(UTC)
azxsdcvfjk

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

Группы: Участники
Зарегистрирован: 06.12.2017(UTC)
Сообщений: 1

Добрый день.

У меня тоже похожая проблема возникает в следующем сценарии:
CSP 5.0.12000 + JCSP (java-csp-5.0.42119-A)


Цель
1) сгенерировать ключевую пару на смарткарте (в данном случае самую обычную -- псевдо не извлекаемую, которая и с криптопро 4.0 работает)
Код:



        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("GOST3410DH_2012_256", "JCSP");
        keyPairGenerator.initialize(new NameAlgIdSpec("\SCARD\ESMART_0000000*cardSerial*0000000\\test_alias"));
        keyPairGenerator.initialize(new PasswordParamsSpec("12345678"));
  KeyPair pair = keyPairGenerator.generateKeyPair();

...
(где-то тут генерируем временный сертификат, потом запрос на сертификат, потом заменяем на постоянный из УЦ)
...
2) сменить пароль от токена

тут я пробовал менять через PKCS11 или


как-то так , (тут результат более предсказуемый и обычно всё работает, вроде)
Код:

        KeyStore keyStore = KeyStore.getInstance(readerName, provider);
        keyStore.load(null, null);
        KeyStore.ProtectionParameter param = null;

        if (password != null)
            param = new KeyStore.PasswordProtection(password);
        KeyStore.Entry entry =  keyStore.getEntry(alias , param);
        keyStore.setEntry(alias + ContainerStore.PASSWORD_PREFIX + new String(newPassword), entry, new KeyStore.PasswordProtection(newPassword));




3) проверить, что всё работает с новым паролем
-- тут и возникает проблема, пока не перезагрузиль сервис криптоПро sudo systemctl restart cprocsp ни один пароль от токена не подходит
Код:

        KeyStore keyStore = KeyStore.getInstance(readerName, provider);
        keyStore.load(null, null);
        KeyStore.ProtectionParameter param = null;
        if (password != null)
            param = new KeyStore.PasswordProtection(password); 
        JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) ((Object) keyStore.getEntry(alias , param));

и вылазит ошибка, если перед этим шагом прибить криптопро sudo systemctl restart cprocsp, то ошибки не будет и всё пройдёт успешно.
Код:

Caused by: ru.CryptoPro.JCP.KeyStore.InvalidPasswordException
	at ru.CryptoPro.JCSP.MSCAPI.cl_2.a(Unknown Source)
	at ru.CryptoPro.JCSP.Key.AbstractKeySpec.read(Unknown Source)
	at ru.CryptoPro.JCSP.KeyStore.CSPStore.a(Unknown Source)
	at ru.CryptoPro.JCSP.KeyStore.CSPStore.a(Unknown Source)
	at ru.CryptoPro.JCSP.KeyStore.CSPStore.engineGetEntry(Unknown Source)
	at ru.CryptoPro.JCSP.KeyStore.MetaCSPStore.engineGetEntry(Unknown Source)
	at java.base/java.security.KeyStore.getEntry(KeyStore.java:1555)
	at test.javaCsp.JcspHelper.getJCPPrivateKeyEntry(JcspHelper.java:158)
	at test.JcspHelper.validateTokenContainer(JcspHelper.java:205)
	at test.JcspService.validateToken(JcspService.java:123)
	... 65 more
Caused by: java.security.AccessControlException: ProvParam ERROR: 0x8010006b
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.setPassword(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.a(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.openContainerWithSetPin(Unknown Source)
	... 75 more
Caused by: ru.CryptoPro.JCSP.MSCAPI.MSProvParamException: ProvParam ERROR: 0x8010006b
	at ru.CryptoPro.JCSP.MSCAPI.MSProvParamException.procCode(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.setProvParam(Unknown Source)
	... 78 more


Если отформатировать карту и снова сменить пароль на по умолчанию, то при генерации ключа возникнет анологичная ошибка

Код:


Caused by: java.security.ProviderException: Error in key creation
	at ru.CryptoPro.JCSP.Key.GostKeyPairGenerator.throwEx(Unknown Source)
	at ru.CryptoPro.JCSP.Key.GostKeyPairGenerator.generateKeyPair(Unknown Source)
	at test.JcspHelper.generateKeyPairOnToken(JcspHelper.java:100)
	at test.JcspService.generateKeyPair(JcspService.java:90)
	... 65 more
Caused by: java.security.UnrecoverableKeyException: Wrong Password
	at ru.CryptoPro.JCSP.MSCAPI.cl_2.a(Unknown Source)
	at ru.CryptoPro.JCSP.Key.AbstractKeySpec.create(Unknown Source)
	... 68 more
Caused by: java.security.AccessControlException: ProvParam ERROR: 0x8010006b
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.setPassword(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.a(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.createContainerWithSetPin(Unknown Source)
	... 70 more
Caused by: ru.CryptoPro.JCSP.MSCAPI.MSProvParamException: ProvParam ERROR: 0x8010006b
	at ru.CryptoPro.JCSP.MSCAPI.MSProvParamException.procCode(Unknown Source)
	at ru.CryptoPro.JCSP.MSCAPI.cl_5.setProvParam(Unknown Source)
	... 73 more



Вопрос: как убрать это странное кэширование паролей в "cprocsp", мне кажется, что проблема примерно та же и связана с каким-то кэшированием чего-то в недрах криптоПро CSP?

Отредактировано пользователем 12 января 2022 г. 20:59:32(UTC)  | Причина: Не указана

Offline biff  
#3 Оставлено : 15 апреля 2022 г. 16:22:08(UTC)
biff

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

Группы: Участники
Зарегистрирован: 20.01.2022(UTC)
Сообщений: 25

Мне лично помогло следущее:

  1. При старте удаляем провайдер JCP через Security.removeProvider (т.к. он идет вместе с JCSP и регистрируется)
  2. Всегда создаем новый экземпляр JCSP перед поиском KeyStore, т.к. иначе он не видит usb токены или не может обновлять их список динамически


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