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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ranzed  
#1 Оставлено : 27 мая 2021 г. 13:41:13(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 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

Ключевой контейнер корректный, успешно используется также в десктоп-клиенте.
Подскажите пожалуйста, в чем может быть проблема?
Offline Евгений Афанасьев  
#2 Оставлено : 27 мая 2021 г. 15:04:02(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 583 раз в 554 постах
Здравствуйте. Ключом ГОСТ пытаетесь подписать хеш sha1.
Offline Ranzed  
#3 Оставлено : 27 мая 2021 г. 17:20:33(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 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)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 27 мая 2021 г. 17:42:47(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 583 раз в 554 постах
Функция выглядит верно, но в вашем стеке ошибки видно, что создаётся com.sec.tima.TimaSignatureSHA1RSA.engineInitSign
И если будет действительно использоваться RSA, то надо указывать имя провайдера у Signature.

Отредактировано пользователем 27 мая 2021 г. 17:43:39(UTC)  | Причина: Не указана

Offline Ranzed  
#5 Оставлено : 31 мая 2021 г. 15:56:45(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 3 раз
Какие есть способы решить данную проблему? Или хотя бы понять почему внутри пытается использовать RSA. Ключ гостовый, в сертификате указаны ГОСТ-алгоритмы, объект Singature мы получается создаем корректно.

Поиск информации по TimaSignatureSHA1RSA приводит к технологии Samsung KNOX, у клиента как раз Samsung на Android 11. https://docs.samsungknox.com/dev/knox-sdk/about-keystores.htm. Есть ли какие-то известные ограничения в работе с Knox?
Offline Евгений Афанасьев  
#6 Оставлено : 31 мая 2021 г. 16:01:01(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 583 раз в 554 постах
А в вашем случае samsung + knox? Попробуйте указать тут Signature signature = Signature.getInstance(signAlg); имя провайдера: Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME);
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Ranzed оставлено 15.06.2021(UTC)
Offline Ranzed  
#7 Оставлено : 15 июня 2021 г. 9:50:16(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 3 раз
Неизвестно точно, использует ли пользователь Knox при работе с нашим приложением.

Код:
Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME);

Попробовал сделать так, это помогло, заработало корректно. Спасибо!
Offline Ranzed  
#8 Оставлено : 17 сентября 2021 г. 16:39:44(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 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
Offline Евгений Афанасьев  
#9 Оставлено : 17 сентября 2021 г. 19:06:00(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 583 раз в 554 постах
Добрый день.
Покажите содержимое com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:160), касающееся объекта Signature.
По ошибке - выглядит, как проблема в первом сообщении, забыли указать имя провайдера в Signature.getInstance().
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.