java.security.KeyStore показывает только один из двух сертификатов в файле p12 - PullRequest
2 голосов
/ 05 апреля 2011

Хорошо, я экспортировал все сертификаты в своем браузере, выполнив следующие действия: Инструменты, Параметры ..., Дополнительно, Шифрование, Просмотр сертификатов, Ваши сертификаты, Резервное копирование всех ... (это в Firefox).

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

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

- НО -

Когда я открываю файл p12 с пакетом java.security. * И смотрю на размер (), он показывает только два сертификата в файле p12.Когда я перебираю псевдонимы, я вижу только два сертификата.Есть ли в объекте KeyStore что-то, что позволяет мне получить доступ ко всем четырем сертификатам?Это сложно, потому что псевдонимы одинаковы для двух пар, отличаются только серийные номера.Заранее благодарим за любую помощь, которую вы можете предоставить.

1 Ответ

4 голосов
/ 30 августа 2011

Хорошо, чтобы ответить на мой древний вопрос ... Я узнал, что Java не так хороша для чтения файлов p12.Он создает хэш-карту, используя псевдоним каждого сертификата в качестве ключа, поэтому, если есть два сертификата с одинаковым псевдонимом, Java закроет первый сертификат вторым сертификатом с тем же псевдонимом (ключом), получив только один сертификат на псевдоним.

При импорте сертификатов в браузер браузер принимает все записи в файле p12 (не заботясь о псевдонимах).

Я обошел эту проблему в том, что использовал exec Java runtime execфункциональность для вызова openssl и передачи вывода каждого сертификата в строку и использования этой строки для создания сертификата X509.Вот пример кода (я не могу скопировать и вставить, так как мой dev-блок не подключен к Интернету):

private ArrayList<X509Certificate> parseCerts( String fileName, String pwd ) {
   ArrayList certsFromP12File = new ArrayList();
   String cmdLine = "/usr/bin/openssl pkcs12 -info -in " + fileName + " -clcerts -nokeys -passin pass:" + pwd;

   String line;

   Process p = Runtime.getRuntime().exec( cmdLine );

   BufferedReader input = new BufferedReader( new InputStreamReader( p.getInputStream() ) );

   boolean readingCert = false;
   boolean gotCertToProcess = false;
   String certString;

   while ((line=input.readLine()) != null ) {
      if ( line.contains("-----BEGIN CERTIFICATE-----") ) {
         readingCert = true;
      }
      if ( readingCert ) {
         certString += line + System.getProperty("line.separator");
      }
      if ( line.contains("-----END CERTIFICATE-----") ) {
         readingCert = false;
         getCertToProcess = true;
      }
      if ( gotCertToProcess ) {
         X509Certificate cert = null;
         byte[] cert_bytes = certString.getBytes();
         ByteArrayInputStream certInputStream = new ByteArrayInputStream(cert_bytes);
         cert = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate( certInputStream );
         certsFromP12File.add( cert );
         gotCertToProcess = false;
         certString = "";
      }
   }
   input.close();

   return certsfromP12File;
}

Надеюсь, что это поможет другим.:)

...