Несколько записей после сохранения одного сертификата в моем хранилище ключей Java

Я использую класс InstallCert, чтобы импортировать сертификат VMware vCenter в локальное хранилище ключей Java.

Строка socket.startHandshake() возвращает UnsupportedOperationException, но класс SavingTrustManager успешно загрузил сертификат.

Затем я сохраняю загруженный сертификат в своем локальном хранилище ключей, используя следующий фрагмент кода.

KeyStore jsk;
... ... ..
jks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacert");
jks.store(out, passphrase);
out.close();

Но когда я пытаюсь перечислить все записи в хранилище ключей: keytool -list -keystore jssecacerts -v, он показывает, что есть 160 записей, включая ту, которую я скачал.

Я почти уверен, что хранилище ключей создается моим кодом, и изначально оно должно быть пустым. Я хотел бы знать, откуда берутся остальные 159 записей?

Спасибо.


person vesontio    schedule 27.01.2016    source источник


Ответы (1)


Используйте KeyStoreExplorer для сравнения обоих доверенных хранилищ: jssecacerts, сгенерированного классом Installcert, и файла cacerts, расположенного в вашей Java>jre>security>lib.

Istalcert берет сертификат с сервера и создает копию хранилища доверенных сертификатов JVM, которую вы используете. затем он добавляет сертификат в копию вашего хранилища доверенных сертификатов и называет его «jssecacerts». Проверьте этот фрагмент кода:

File file = new File("jssecacerts");
    if (file.isFile() == false) {
        char SEP = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + SEP
        + "lib" + SEP + "security");
        file = new File(dir, "jssecacerts");
        if (file.isFile() == false) {
            file = new File(dir, "cacerts");

            }
    }

Затем вам просто нужно переименовать jsscacerts в cacerts и заменить исходный на вашей JVM.

person Oldskultxo    schedule 27.01.2016
comment
Спасибо за ответ, на самом деле меня смущает количество записей в хранилище ключей. Я скачал и импортировал только один сертификат, но почему в хранилище ключей 160 записей. - person vesontio; 01.02.2016
comment
Вероятно, потому что в доверительном хранилище, которое использует ваш jvm, было 159. сравните оба хранилища доверия и проверьте это :). - person Oldskultxo; 01.02.2016
comment
Код installCert экспортирует загруженный сертификат в файл с именем jssecacerts. Я почти уверен, что файл создан моей программой, так как я удалил файл перед запуском своей программы. - person vesontio; 01.02.2016
comment
Ok. Не проверяйте, если не хотите, но... Это все, чем я могу вам помочь. Неважно, насколько вы уверены в поведении приложения InstallCert. Поведение такое, какое оно есть. Проверьте фрагмент кода этого приложения, который я только что добавил в свой ответ, и примите решение. JSSECACERTS НЕ генерируется из пустого файла. Проверьте это и сравните оба файла, и давайте посмотрим, наконец ли вы убедились :) - person Oldskultxo; 01.02.2016
comment
Пожалуйста, проверьте строку 147 из installCert: OutputStream out = new FileOutputStream("jssecacerts");, она не использует повторно переменную file. - person vesontio; 01.02.2016
comment
Как вам удобнее... проверьте весь код приложения, а не только эту строку... Он не использует файловую переменную?? А что с кс файлом?? в любом случае, я не могу помочь вам, если вы не хотите помощи. Удачи. Здесь вы можете прочитать о поведении приложения: dekho.com.au/help/32/ - person Oldskultxo; 01.02.2016
comment
Как вы сказали, я прочитал документ и проверил последнее предложение 6-го раздела: The imported certificates get added to a keystore named “jssecacerts” in the current directory (i.e., C:\temp\installcerts) - person vesontio; 02.02.2016
comment
Мой друг. Давайте проясним: InstallCert создает C:/temp/jssecacerts; истинный. Но этот файл является копией файла cacerts, размещенного в папке JaVA_HOME/jre/security/lib. После копирования Install cert добавит ваш сертификат. В любом случае, пожалуйста, прежде чем продолжать жаловаться, проверьте оба файла с помощью инструмента, который я предложил, и убедитесь, что единственная разница в том, что у jssecacerts есть ваш сертификат, а у cacerts нет. - person Oldskultxo; 02.02.2016
comment
Хорошо, теперь я вижу, jssecacerts, сгенерированный InstallCert, содержит все сертификаты в хранилище доверенных сертификатов JRE + тот, который он загрузил. Благодарю вас! - person vesontio; 02.02.2016