KeyStore.load выбрасывает IOException в пустой файл .jks - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно создать пустой файл KeyStore (с именем KeyStoreAES.jks), а затем сохранить AES SecretKey в этот файл, все это программно из Java.

У меня есть эта функция, которая создает файл .jks:

//Función that creates KeyStoreAES.jks
private static void CreateKeyStoreAES(String path)
{
    try
    {
        //Check if file already exists
        File keyStoreFile = new File(path);

        if (keyStoreFile.exists())
        {
            keyStoreFile.delete();
        } //if

        keyStoreFile.createNewFile();
    } 
    catch (IOException ex)
    {
        System.out.println("IOException");
    }
} //CrearKeyStoreAES

Эта функция работает нормально. Затем у меня есть другая функция для вставки ключа в этот файл:

//Storing Key into KeyStore file
private static void StoreKey(String path, SecretKey key)
{
    try
    {       
        //KeyStore
        KeyStore ks = KeyStore.getInstance("JKS"); //JCEKS, JKS

        //FileInputStream
        FileInputStream fis = new FileInputStream(path);

        //Load KeyStore file
        ks.load(fis, keyStorePass);
    } 
    catch (CertificateException ex)
    {
        System.out.println("CertificateException");
    }
    catch (IOException ex)
    {
        System.out.println("IOException");
    }
    catch (KeyStoreException ex)
    {
        System.out.println("KeyStoreException");
    } 
    catch (NoSuchAlgorithmException ex)
    {
        System.out.println("NoSuchAlgorithmException");
    } //try
} //StoreKey

Вызов функции загрузки из класса KeyStore вызывает IOException. Это потому, что файл, который пытается загрузить, пуст? Насколько я искал в интернете, чтобы вставить ключ в хранилище ключей, вам нужно загрузить этот файл в объект хранилища ключей.

1 Ответ

1 голос
/ 08 ноября 2019

Да, для формата JKS требуются данные заголовка и трейлера, поэтому пустой файл не является допустимым JKS, а JKS без записей не является пустым файлом.

Чтобы создать JKS с нуля, не загружать любой файл / данные :

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(null); // NO INPUTSTREAM HERE
...
ks.setKeyEntry(...); // or .setEntry(...) as desired
...
OutputStream fo = Files.newOutputStream(Path.of("myfile")); // or similar
ks.store(fo,password); fo.close();

Однако формат JKS не поддерживает записи SecretKey, так что это по-прежнему не решит проблему. проблема. Вам нужно будет использовать другой формат, такой как JCEKS или PKCS12, или BKS BouncyCastle - все это также не может быть пустым файлом.

...