Как проверить, что InputStream пуст в контексте генерации CRL? - PullRequest
0 голосов
/ 15 октября 2019

Учитывая URL CRL, я хочу получить объект X509CRL. Ниже приведен код,

    private static X509CRL downloadCRLFromWeb(String crlURL) throws
            MalformedURLException, IOException, CertificateException, CRLException {

        URL url = new URL(crlURL);
        InputStream crlStream = url.openStream();
        try {
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            return (X509CRL) cf.generateCRL(crlStream);
        } catch (CRLException e) {
            System.out.println("Caught exception: " + e.getMessage());
            e.printStackTrace();
            return null;
        } finally {
            assert crlStream != null;
            crlStream.close();
        }

Строка return (X509CRL) cf.generateCRL(crlStream); сгенерирует CRLException: Empty input для некоторых URL, которые я пробовал (не для всех).

Ниже приведена трассировка стека,

java.security.cert.CRLException: Empty input
    at sun.security.provider.X509Factory.engineGenerateCRL(X509Factory.java:397)
    at java.security.cert.CertificateFactory.generateCRL(CertificateFactory.java:497)
    at demo.pkcs.pkcs11.TryLDAP.downloadCRLFromWeb(TryLDAP.java:60)
    at demo.pkcs.pkcs11.TryLDAP.main(TryLDAP.java:83)

Также отмечено, что crlStream не возвращает -1 при чтении, следовательно, оно не совсем "пусто". Чем именно вызвано это исключение и как я могу его решить? И как я могу исправить этот код, чтобы я мог получить X509CRL Объект из URL-адресов, из которых я получаю это исключение?

1 Ответ

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

Для URL-адресов, из которых я получил исключение, я решил следующие шаги:

  1. Преобразовать crlStream в String объект
  2. Добавить "-----BEGIN X509CRL-----\n" и "\n-----END X509CRL-----\n" в начале и конце crlStreamString
  3. Преобразование crlStreamString обратно в InputStream

Ниже приведен рабочий код,

        InputStream crlStream = url.openStream();
        String stream = IOUtils.toString(crlStream);
        String tryPEM = "-----BEGIN X509CRL-----\n";
        tryPEM = tryPEM.concat(stream);
        tryPEM = tryPEM.concat("\n-----END X509CRL-----\n");
        System.out.println(tryPEM);
        try {
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            return (X509CRL) cf.generateCRL(IOUtils.toInputStream(tryPEM));
...