Во-первых, ваш файл PKCS12, созданный с помощью openssl pkcs12 -export
, уже - хранилище ключей Java;хотя версии Java ниже 9 по умолчанию в формате JKS для хранилищ ключей, они также поддерживают PKCS12, а по умолчанию j9 по умолчанию - PKCS12.Итак, вы можете просто использовать хранилище ключей PKCS12, и все готово.Но SO касается программирования, поэтому решение, которое вообще ничего не требует, может быть не по теме:)
Если вы хотите (или как-то нужно) создать хранилище ключей самостоятельно, и у вас есть сертификат сущностив одном файле (если на самом деле подчиненный ЦС, как подсказывает ваше имя и непосредственно под корнем) и корневой сертификат в другом, вы можете прочитать каждый из них и сформировать цепочку, например:
// read privatekey, reformat to PKCS8 and process-in as you do now
CertificateFactory fact = CertificateFactory.getInstance("X.509");
InputStream file1 = new FileInputStream("mycert.pem"), file2 = new FileInputStream("rootcert.pem");
Certificate[] chain = { fact.generateCertificate(file1), fact.generateCertificate(file2) };
file1.close(); file2.close(); // or use try-with-resources
// if already in memory use ByteArrayInputStream's instead,
// and maybe don't bother closing
// basically unchanged
KeyStore keyStore = KeyStore.getInstance("JKS"); // or maybe "PKCS12" ?
keyStore.load(null, null);
keyStore.setKeyEntry("name", key, (keypass), chain);
// either use this keystore as is, or store it (to a file,
// or maybe somewhere else like a database) for later use
Обратите внимание, что вам не нужно удалять заголовок / трейлер PEM и конвертировать base64 в двоичный файл, CertificateFactory
может читать PEM с прошлого века.Хотя, если ваши PEM-файлы содержат дополнительную информацию «комментария» перед блоком PEM, что часто делают файлы, созданные OpenSSL, вам понадобится довольно свежая версия Java (IIRC j6 или, возможно, j7) для обработки , что .
В качестве альтернативы, если вы объединяете сертификаты - либо в файле, либо в памяти - вы можете использовать CertificateFactory.generateCertificates
(обратите внимание на s), чтобы прочитать оба из них в Collection
, который вы затем преобразуете вмассив.Опять же, это уже обрабатывает PEM, поэтому вам не нужно анализировать и преобразовывать его.Обратите внимание, что вы можете преобразовать либо Collection
, либо List
(как в коде выше) в массив напрямую, без необходимости сначала проходить Stream
.