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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline MrLebovsky  
#1 Оставлено : 5 лет назад
MrLebovsky

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

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

Добрый день!
Имеется .pem файл с содержимым вида:

Цитата:
-----BEGIN PRIVATE KEY-----
MEgCAQAwHwYIKoUDBwEBAQEwEwYHKoUDAgIkAAYIKoUDBwEBAgIEIgQgp3M+ctHb
ingDcHWgE0uzqoJkykQhG2fjAv63l9Wnu1g=
-----END PRIVATE KEY-----


Пытаемся на Java вытянуть из этого файла PrivateKey. Соответственно получаем
Цитата:
java.security.spec.InvalidKeySpecException

Здесь - stackoverflow приводится решение, в котором говорится, что необходимо добавить информацию об алгоритме ключа, что мы сделали следующим образом:

Код:

            byte[] data = Base64.getDecoder().decode(builder.toString());

            /* Add PKCS#8 formatting */
            ASN1EncodableVector v = new ASN1EncodableVector();
            v.add(new ASN1Integer(0));
            ASN1EncodableVector v2 = new ASN1EncodableVector();
            v2.add(new ASN1ObjectIdentifier("1.2.643.7.1.1.3.2"));
            v2.add(DERNull.INSTANCE);
            v.add(new DERSequence(v2));
            v.add(new DEROctetString(data));
            ASN1Sequence seq = new DERSequence(v);
            byte[] privKey = seq.getEncoded("DER");
            PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privKey);
            KeyFactory fact = KeyFactory.getInstance("GOST3410_2012_256");
            key = fact.generatePrivate(spec);


Тем не менее, ошибка так же самая:
Цитата:
Exception in thread "main" java.security.spec.InvalidKeySpecException
at ru.CryptoPro.JCP.Key.GostKeyFactory.engineGeneratePrivate(Unknown Source)
at java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:390)
Offline MrLebovsky  
#2 Оставлено : 5 лет назад
MrLebovsky

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

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

НАША ПОСЛЕДОВАТЕЛЬНОСТЬ ДЕЙСТВИЙ:

1. Имеем pfx файл с key-pair от тестового УЦ.
С помощью КриптоПРО CSP произведен экспорт, после чего получили keystore.000 (обычная папка) с содержимым:

header.key masks.key masks2.key name.key primary.key primary2.key

2. Далее конвертировали в pem (открытый ключ cert.pem и закрытый ключ key.pem)

3. С помощью OpenSSL с поддержкой ГОСТ2012 конвертировали .pem в .p12 хранилище
При этом, если например открыть такой файл через ПО "KeyStore Explorer" он показывает privateKey как "locked" и при попытке его "разлочить" выдает сообщение "Encoded key spec not recognized: unknown tag 30 encountered"
При попытке извлечения закрытого ключа на Java из .p12

Код:

        InputStream is = new FileInputStream("D:/keystore.p12");
        String p12Password = "12345";
        KeyStore keystore = KeyStore.getInstance("PKCS12");
        keystore.load(is, p12Password.toCharArray());
        PrivateKey key = (PrivateKey) keystore.getKey("keystore", p12Password.toCharArray());


вылетает

Цитата:
exception: java.security.spec.InvalidKeySpecException
at ru.CryptoPro.JCP.Key.GostKeyFactory.engineGeneratePrivate(Unknown Source)


4. При попытке извлечения закрытого ключа на Java из .pem описано в шапке темы


Пожалуйста подскажите, в чем может быть проблема?
Наши тестовые ключи и сертификаты - pem and p12 keystore.rar (3kb) загружен 1 раз(а).

Отредактировано пользователем 5 лет назад  | Причина: Не указана

Offline two_oceans  
#3 Оставлено : 5 лет назад
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Вопрос в том, чего Вы хотите добиться? Странно, что смотрите на stackoverflow хотя конкретно на этом форуме есть исчерпывающие инструкции. Правильный ответ: скопировать папку с 6 файлами .key полученными на первом шаге в определенную папку, где КриптоПро JCP/JCSP увидит ее и опознает как контейнер. Расположение зависит от ОС, на которой работает Джава, можете посмотреть в соседних темах.

К слову, формат p12 и pfx это одно и то же, может отличаться только шифрование содержимого и алгоритмы хэшей. С таким же результатом могли подсунуть файл от УЦ вместо p12.

Загрузка из .pem файлов в КриптоПро (насколько я понимаю) не поддерживается в принципе. Аналогично как и выгрузка в .pem файлы не поддерживается штатными способами. Причина - экспорт ключа в незашифрованный формат противоречит требованиям сертификации и соответственно импорт тоже не реализован. Вероятно Вы нестандартными средствами вытащили из контейнера КриптоПро или из pfx файла в неподдерживаемый формат pem (шаг 2) и теперь пытаетесь передать его обратно стандартным средствам?

Если же Вы получили экземпляр класса PrivateKey из стандартных средств КриптоПро и сохранили его в файл, то так работать не будет. Стандартные средства возвращают не сам закрытый ключ, а дескриптор ключа - как только дескриптор закроется, файл с дескриптором станет бесполезен. Для обычной программы реальный закрытый ключ не нужен, поэтому достаточно дескриптора в PrivateKey, который при криптооперации попадет в обратно криптопровайдер, привязанный к конкретному экземпляру PrivateKey. Однако вытащить таким способом реальный закрытый ключ нельзя.

Отредактировано пользователем 5 лет назад  | Причина: опечатки

Offline Евгений Афанасьев  
#4 Оставлено : 5 лет назад
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 721 раз в 680 постах
Здравствуйте.
JCP не поддерживает PKCS12.
Java CSP поддерживает тип "PFX" (...KeyStore.getInstance("PFX", "JCSP")...) для ключей, экспортированных в этом формате из КриптоПро CSP.
Offline MrLebovsky  
#5 Оставлено : 5 лет назад
MrLebovsky

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

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

Всем отписавшимся спасибо!
По итогу всё решилось работой с HDImageKeyStore (папка с 6ю файлами .key)
Offline Gauri  
#6 Оставлено : 3 месяца назад
Gauri

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

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

На случай, если кто-то ещё наткнётся на эту тему - из PEM файлов можно сконвертировать в PFX формат, понятный КриптоПро:
Код:
openssl pkcs12 -engine gost -export -inkey ключ.pem -in сертификат.cer -export -out результат.pfx -keypbe gost89

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