Как программно читать файл p7b на java

У меня есть файл.p7b в моем локальном хранилище (C:\Users\Certs\cert.p7b). Это решение не работает для меня.

Я пробовал следующее.

File file = new File("C:\Users\Certs\cert.p7b");
BufferedInputStream bis = null;
try {
     byte[] buffer = new byte[(int) file.length()];
     DataInputStream in = new DataInputStream(new FileInputStream(file));
     in.readFully(buffer);
     in.close();
     CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");
     X509Certificate cert = certificatefactory.getCertificate(in);
}catch (Exception e){
     System.out.println("Exception");
}

Но это не работает. Итак, как мне загрузить этот файл.p7b, а затем сохранить его в хранилище ключей.

2 ответа

Решение

Чтобы прочитать сертификаты из файла PKCS#7, вы можете использовать этот фрагмент кода:

public static final Certificate[] readCertificatesFromPKCS7(byte[] binaryPKCS7Store) throws Exception
{
    try (ByteArrayInputStream bais = new ByteArrayInputStream(binaryPKCS7Store);)
    {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        Collection<?> c = cf.generateCertificates(bais);

        List<Certificate> certList = new ArrayList<Certificate>();

        if (c.isEmpty())
        {
            // If there are now certificates found, the p7b file is probably not in binary format.
            // It may be in base64 format.
            // The generateCertificates method only understands raw data.
        }
        else
        {

            Iterator<?> i = c.iterator();

            while (i.hasNext())
            {
                certList.add((Certificate) i.next());
            }
        }

        java.security.cert.Certificate[] certArr = new java.security.cert.Certificate[certList.size()];

        return certList.toArray(certArr);
    }
}

Вы закрыли InputStream. После этого вы не сможете читать по нему.

Вы не должны использовать DataInputStream. Вы не должны использовать буфер. Просто откройте файл и позвольте CertificateFactory читать из него:

X509Certificate cert = null;
File file = new File("C:\\Users\\Certs\\cert.p7b");
try (InputStream in = new BufferedInputStream(new FileInputStream(file))) {
     CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");
     cert = certificatefactory.generateCertificate(in);
} catch (CertificateException e) {
     e.printStackTrace();
}

Всегда печатайте или регистрируйте полную трассировку стека перехваченного исключения. В конце концов, вы хотите знать, что происходит не так. Его сокрытие не поможет вашей программе, не поможет вам и не поможет нам.

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

Другие вопросы по тегам