Как я могу объединить два файла ".jceks" в один? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть два файла kestore1.jceks и keystore2.jceks . Я хочу объединить их и загрузить в объект KeyStore.

KeyStore KEY_STORE = KeyStore.getInstance("JCEKS");

input1 = new FileInputStream("C:\\Users\\tushar.moradiya\\Desktop\\keystore\\keystore1.jceks");
KEY_STORE.load(input1, Constant.JCEKS_KEYSTORE_FILE_PASSWORD.toCharArray());

input2 = new FileInputStream("C:\\Users\\tushar.moradiya\\Desktop\\keystore\\keystore2.jceks");
KEY_STORE.load(input2, Constant.JCEKS_KEYSTORE_FILE_PASSWORD.toCharArray());

, но он не работает. Переопределяет последний файл в объекте.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Есть и другой способ сделать это, используя keytool утилиту командной строки. Если это будет один раз, я рекомендую использовать keytool. Но если это будет вашей бизнес-логикой, то вы можете сделать это следующим образом:

    KeyStore first = KeyStore.getInstance("JCEKS");
    first.load(new FileInputStream(new File("first.jceks")), "password".toCharArray());

    KeyStore second = KeyStore.getInstance("JCEKS");
    second.load(new FileInputStream(new File("second.jceks")), "password".toCharArray());

    Enumeration<String> aliases = first.aliases();

    while (aliases.hasMoreElements())
    {
        String alias = aliases.nextElement();
        System.out.println(alias);

        KeyStore.Entry entry = null;
        try
        {
            entry = first.getEntry(alias, new KeyStore.PasswordProtection("password".toCharArray()));
        }
        catch (UnsupportedOperationException e)
        {
            entry = first.getEntry(alias, null);
        }

        if (entry instanceof TrustedCertificateEntry)
        {
            second.setCertificateEntry(alias, ((TrustedCertificateEntry) entry).getTrustedCertificate());
        }
        else
        {
            second.setEntry(alias, entry, new KeyStore.PasswordProtection("password".toCharArray()));
        }
    }

    second.store(new FileOutputStream(new File("second.jceks")), "password".toCharArray());

Это скопирует все первые записи хранилища ключей во второе хранилище ключей.

PS: Сохранитькопия оригинального хранилища ключей.

0 голосов
/ 24 октября 2019

Вы не можете прочитать их в один объект, но вы можете прочитать их в два объекта, а затем объединить содержимое, по крайней мере, там, где они не конфликтуют:

    KeyStore ks1 = KeyStore.getInstance("jceks"), ks2 = KeyStore.getInstance("jceks");
    char[] pw = args[2].toCharArray(); KeyStore.PasswordProtection pp = new KeyStore.PasswordProtection (pw);
    try( InputStream is1 = new FileInputStream(args[0]) ){ ks1.load(is1,pw); }
    try( InputStream is2 = new FileInputStream(args[1]) ){ ks2.load(is2,pw); }
    for( Enumeration<String> aliases = ks2.aliases(); aliases.hasMoreElements(); ){
        String alias = aliases.nextElement();
        if( ks1.containsAlias(alias) ){ /* conflicting entry -- what to do? */ }
        ks1.setEntry(alias,  ks2.getEntry(alias, pp), pp);
        // could check type (or other details) before deciding whether to include
    }

Вы можететакже объедините их в один файл , используя keytool -importkeystore (и они читаются в этом отдельном файле), но это не является программным решением и, таким образом, является оффтопическим или, по крайней мере, пограничным.

...