Статус: Участник
Группы: Участники
Зарегистрирован: 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);
}
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.01.2022(UTC) Сообщений: 25
|
Мне лично помогло следущее:
- При старте удаляем провайдер JCP через Security.removeProvider (т.к. он идет вместе с JCSP и регистрируется)
- Всегда создаем новый экземпляр JCSP перед поиском KeyStore, т.к. иначе он не видит usb токены или не может обновлять их список динамически
Документации никакой нет, поэтому не в курсе, на сколько такие действия правильные, по крайней мере, так оно работает.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close