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

Уведомление

Icon
Error

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

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

Группы: Участники
Зарегистрирован: 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

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

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

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

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

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

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

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Функция выглядит верно, но в вашем стеке ошибки видно, что создаётся 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)
Сообщений: 17
Российская Федерация
Откуда: Ижевск

Сказал(а) «Спасибо»: 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,540
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
А в вашем случае 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)
Сообщений: 17
Российская Федерация
Откуда: Ижевск

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

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

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

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

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

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Добрый день.
Покажите содержимое com.companyname.appname.CryptoProAdapter.sign(CryptoProAdapter.java:160), касающееся объекта Signature.
По ошибке - выглядит, как проблема в первом сообщении, забыли указать имя провайдера в Signature.getInstance().
Offline Ranzed  
#10 Оставлено : 20 сентября 2021 г. 13:43:05(UTC)
Ranzed

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

Группы: Участники
Зарегистрирован: 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
Offline Ranzed  
#11 Оставлено : 4 октября 2021 г. 12:16:31(UTC)
Ranzed

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

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

Сказал(а) «Спасибо»: 3 раз
Есть ли какие-то обновления по данному вопросу? Какую ещё дополнительную информацию мы можем предоставить для анализа?
Сейчас из-за этой проблемы у клиента блокируется работа в нашем приложении.
Offline Евгений Афанасьев  
#12 Оставлено : 5 октября 2021 г. 9:38:52(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Автор: Ranzed Перейти к цитате
Есть ли какие-то обновления по данному вопросу? Какую ещё дополнительную информацию мы можем предоставить для анализа?
Сейчас из-за этой проблемы у клиента блокируется работа в нашем приложении.

Подобную ошибку мы встречали один раз, в случае Knox: при отсутствии имени провайдера в конструкции вида Signature.getInstance jvm использует некую свою реализацию (TimaSignatureSHA1RSA) по умолчанию, которая, естественно, ГОСТ не знает.
Указанный выше стек ошибки относится к
Автор: Ranzed Перейти к цитате

Трейс ошибки тот же самый. Воспроизводится на планшете Samsung с Android 11. Защищенный контейнер Knox не используется.

?
Клиент ничего не напутал и использует ваше приложение с корректным Signature.getInstance?
Если в коде действительно верно задан Signature.getInstance и правильно определяется алгоритм подписи с помощью getSignatureInstanceAlgName (именно ГОСТ по certificate), то:
1. выведите список провайдеров с помощью:
Код:

Provider[] providers = Security.getProviders();
for (Provider provider : providers) {
  System.out.println("%% PROVIDER: " + provider.getName() + ", info = " + provider.getInfo());
  Set<Provider.Service> services = provider.getServices();
  Iterator<Provider.Service> iterator = services.iterator();
  while (iterator.hasNext()) {
    Provider.Service service = iterator.next();
    System.out.println("\t * algorithm = " + service.getAlgorithm() + ", class = " + service.getClassName());
  } // while
} // for

2. Дайте детальное описание устройства.
3. Приложите весь лог в том числе до появления стека ошибки, возможно, выше по логу будет еще какая-то информация.

4. Выведите провайдер из Signature в коде п.1 до signature.initSign:
Цитата:

Signature signature = Signature.getInstance(signAlg, JCSP.PROVIDER_NAME);
Provider p = signature.getProvider(); // <-- распечатать Provider
signature.initSign(privateKey);

Отредактировано пользователем 5 октября 2021 г. 14:42:06(UTC)  | Причина: Не указана

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