Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
Добрый день! Столкнулись с проблемой у одного из наших клиентов. Пытается выполнить подписание документа, но получает ошибку Цитата:2021-05-25 17:02:05.668 +02:00 Error Java.Security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 --- End of managed Java.Security.InvalidKeyException stack trace --- java.security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:94) at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:77) at java.security.Signature$Delegate.engineInitSign(Signature.java:1383) at java.security.Signature.initSign(Signature.java:679) at com.sec.tima.TimaSignatureSHA1RSA.engineInitSign(TimaSignatureSHA1RSA.java:155) at java.security.Signature$Delegate.init(Signature.java:1357) at java.security.Signature$Delegate.chooseProvider(Signature.java:1310) at java.security.Signature$Delegate.engineInitSign(Signature.java:1385) at java.security.Signature.initSign(Signature.java:679) at com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:157) Gsm Ошибка происходит в этом участке кода: Код:public byte[] sign(byte[] signingData, String alias, String password) {
KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCSP.PROVIDER_NAME);
keyStore.load(null, null);
KeyStore.ProtectionParameter protectedParam = new KeyStore.PasswordProtection(password.toCharArray());
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(alias, protectedParam);
PrivateKey privateKey = entry.getPrivateKey();
X509Certificate certificate = (X509Certificate) entry.getCertificate();
String signAlg = getSignatureInstanceAlgName(certificate);
Signature signature = Signature.getInstance(signAlg);
signature.initSign(privateKey); // <-- тут происходит ошибка
signature.update(signingData);
На Android-устройстве установлена КриптоПроSCP версия 5.0.40424. В приложении используются библиотеки из android-csp-4.0.38674 Ключевой контейнер корректный, успешно используется также в десктоп-клиенте. Подскажите пожалуйста, в чем может быть проблема?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. Ключом ГОСТ пытаетесь подписать хеш sha1. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
В логах мы пишем параметры, по которым определяем алгоритм хеширования. Логируем x509Certificate.CertificateStructure.SubjectPublicKeyInfo.AlgorithmIDЦитата:Info GetDigestAlgName. KeyAlgOid = 1.2.643.7.1.1.1.1 Gsm Этот OID соответствует алгоритму GOST_R3410_12_256, в этом случае мы используем GOST3411_2012_256 для вычисления хеша. Другие причины у этой ошибки могут быть? Добавлю пример кода, где определяем SignatureAlgName, который используется в Signature.getInstance(signAlg), может тут что-то некорректно. Код: private static String getSignatureInstanceAlgName(Certificate cert) {
String publicKeyAlg = cert.getPublicKey().getAlgorithm().toUpperCase();
if (publicKeyAlg.equalsIgnoreCase(JCP.GOST_EL_2012_256_NAME)
|| publicKeyAlg.equalsIgnoreCase(JCP.GOST_DH_2012_256_NAME)) {
return JCP.GOST_SIGN_2012_256_NAME;
} else if (publicKeyAlg.equalsIgnoreCase(JCP.GOST_EL_2012_512_NAME) ||
publicKeyAlg.equalsIgnoreCase(JCP.GOST_DH_2012_512_NAME)) {
return JCP.GOST_SIGN_2012_512_NAME;
} else if (publicKeyAlg.contains("GOST")) {
return JCP.GOST_EL_SIGN_NAME;
} else if (publicKeyAlg.contains("RSA")) {
return "SHA1withRSA"; // для RSA ключей работаем только с хэшированием SHA1
}
return "";
}
Отредактировано пользователем 27 мая 2021 г. 17:25:51(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Функция выглядит верно, но в вашем стеке ошибки видно, что создаётся com.sec.tima.TimaSignatureSHA1RSA.engineInitSign И если будет действительно использоваться RSA, то надо указывать имя провайдера у Signature. Отредактировано пользователем 27 мая 2021 г. 17:43:39(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
Какие есть способы решить данную проблему? Или хотя бы понять почему внутри пытается использовать RSA. Ключ гостовый, в сертификате указаны ГОСТ-алгоритмы, объект Singature мы получается создаем корректно. Поиск информации по TimaSignatureSHA1RSA приводит к технологии Samsung KNOX, у клиента как раз Samsung на Android 11. https://docs.samsungknox.com/dev/knox-sdk/about-keystores.htm. Есть ли какие-то известные ограничения в работе с Knox?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
А в вашем случае samsung + knox? Попробуйте указать тут Signature signature = Signature.getInstance(signAlg); имя провайдера: Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME); |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
Ranzed оставлено 15.06.2021(UTC)
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
Неизвестно точно, использует ли пользователь Knox при работе с нашим приложением. Код:Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME);
Попробовал сделать так, это помогло, заработало корректно. Спасибо!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
Добрый день! Вновь возникла данная проблема, уже у другого клиента, в версии приложения с исправлением (т.е. явно указано JCSP.PROVIDER_NAME). Трейс ошибки тот же самый. Воспроизводится на планшете Samsung с Android 11. Защищенный контейнер Knox не используется. На другом смартфоне Samsung тоже с Android 11 повторили процесс подписания с тем же самым контейнером закрытого ключа, все выполнилось успешно. Подскажите пожалуйста, в чем ещё может быть дело, или как точнее диагностировать проблему? Цитата:2021-09-09 12:47:20.177 +03:00 Error Java.Security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 --- End of managed Java.Security.InvalidKeyException stack trace --- java.security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:94) at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:77) at java.security.Signature$Delegate.engineInitSign(Signature.java:1383) at java.security.Signature.initSign(Signature.java:679) at com.sec.tima.TimaSignatureSHA1RSA.engineInitSign(TimaSignatureSHA1RSA.java:155) at java.security.Signature$Delegate.init(Signature.java:1357) at java.security.Signature$Delegate.chooseProvider(Signature.java:1310) at java.security.Signature$Delegate.engineInitSign(Signature.java:1385) at java.security.Signature.initSign(Signature.java:679) at com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:160) Gsm
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Добрый день. Покажите содержимое com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:160), касающееся объекта Signature. По ошибке - выглядит, как проблема в первом сообщении, забыли указать имя провайдера в Signature.getInstance(). |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2015(UTC) Сообщений: 17 Откуда: Ижевск Сказал(а) «Спасибо»: 3 раз
|
Вот целиком это метод, он уже содержит предложенное выше исправление Код: public byte[] sign(byte[] signingData, String alias, String password) {
try {
logger.logMessage("Create KeyStore");
KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCSP.PROVIDER_NAME);
logger.logMessage("Load KeyStore");
keyStore.load(null, null);
KeyStore.ProtectionParameter protectedParam = new KeyStore.PasswordProtection(password.toCharArray());
JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(alias, protectedParam);
logger.logMessage("Get keyStoreEntry success");
PrivateKey privateKey = entry.getPrivateKey();
X509Certificate certificate = (X509Certificate) entry.getCertificate();
logger.logMessage("Get Certificate and Key success");
String signAlg = getSignatureInstanceAlgName(certificate);
logger.logMessage("Create Signature instance");
//Signature signature = Signature.getInstance(signAlg); fix from cryptopro https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=125062#post125062
Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME);
logger.logMessage("Signature init with private key");
signature.initSign(privateKey);
logger.logMessage("Update Signature with encoded signed attrs and create signature body");
signature.update(signingData);
return signature.sign();
} catch (Throwable e) {
e.printStackTrace();
logger.logException(e);
}
return null;
}
Приложу сразу лог выполнения этого кода перед возникновением ошибки. Цитата:2021-09-09 12:47:20.122 +03:00 Info CryptoProProvider Create KeyStore Gsm 2021-09-09 12:47:20.123 +03:00 Info CryptoProProvider Load KeyStore Gsm 2021-09-09 12:47:20.161 +03:00 Info CryptoProProvider Get keyStoreEntry success Gsm 2021-09-09 12:47:20.161 +03:00 Info CryptoProProvider Get Certificate and Key success Gsm 2021-09-09 12:47:20.167 +03:00 Info CryptoProProvider Create Signature instance Gsm 2021-09-09 12:47:20.171 +03:00 Info CryptoProProvider Signature init with private key Gsm 2021-09-09 12:47:20.177 +03:00 Error Error in cryptopro: Java.Security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 --- End of managed Java.Security.InvalidKeyException stack trace --- java.security.InvalidKeyException: Unsupported private key type: CryptoPro Gost PrivateKey (GOST3410DH_2012_256) with parameters: 1.2.643.7.1.1.6.1 at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:94) at android.security.keystore.AndroidKeyStoreSignatureSpiBase.engineInitSign(AndroidKeyStoreSignatureSpiBase.java:77) at java.security.Signature$Delegate.engineInitSign(Signature.java:1383) at java.security.Signature.initSign(Signature.java:679) at com.sec.tima.TimaSignatureSHA1RSA.engineInitSign(TimaSignatureSHA1RSA.java:155) at java.security.Signature$Delegate.init(Signature.java:1357) at java.security.Signature$Delegate.chooseProvider(Signature.java:1310) at java.security.Signature$Delegate.engineInitSign(Signature.java:1385) at java.security.Signature.initSign(Signature.java:679) at com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:160) Gsm
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close