Сгенерируйте цепочку сертификатов p7b с помощью bouncycastle на Java

Мне нужно сгенерировать цепочку сертификатов p7b, используя надувной замок 1.58.

В более старой версии, которую мы использовали (1.46), этот код работал:

        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
        Certificate [] chain = certificate.getCertificateChain();
        CertStore certStore;
        try {
            certStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)));
            gen.addCertificatesAndCRLs(certStore);

            CMSSignedData signedData = gen.generate(null,(Provider)null);
            return signedData.getEncoded();
        } catch (Exception ex) {
            logger.error("Failed to construct P7B response",ex);
            throw new RuntimeException(ex);
        }

Однако в новой версии Bouncy Castle есть некоторые изменения CMSSignedDataGenerator, поэтому я изменил свой код следующим образом:

        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
        Certificate [] chain = certificate.getCertificateChain();
        try {
            JcaCertStore store = new JcaCertStore(Arrays.asList(chain));
            gen.addCertificates(store);

            CMSSignedData signedData = gen.generate(null);
            return signedData.getEncoded();
        } catch (Exception ex) {
            logger.error("Failed to construct P7B response",ex);
            throw new RuntimeException(ex);
        } 

Однако я получаю исключение нулевого указателя в этой строке внутри генерации:

CMSSignedData signedData = gen.generate(null);

Я попытался выполнить отладку и проверил, что сертификаты загружены в JcaCertStore, так что с этой частью все в порядке.

Однако, когда я пытаюсь отладить библиотеку надувного замка, отладчик не может найти номера строк класса CMSSignedDataGenerator.

Я использую Wildfly для развертывания своего проекта, и я прикрепил банку с источниками к отладчику, однако я вижу код, но рядом с именем класса я получаю строка недоступна, поэтому я не может увидеть, где возникает исключение нулевого указателя.

введите описание изображения здесь

Также интересно то, что я вижу в этом классе пустой значок Java:  введите описание изображения здесь


person user3362334    schedule 21.12.2017    source источник


Ответы (1)


Я решил проблему с помощью следующего кода:

        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
        Certificate [] chain = certificate.getCertificateChain();
        try {
            CMSProcessableByteArray msg = new CMSProcessableByteArray("".getBytes());
            JcaCertStore store = new JcaCertStore(Arrays.asList(chain));
            gen.addCertificates(store);
            CMSSignedData signedData = gen.generate(msg);
            return signedData.getEncoded();
        } catch (Exception ex) {
            logger.error("Failed to construct P7B response",ex);
            throw new RuntimeException(ex);
        } 

Однако я рассматриваю это как своего рода взлом, поскольку вы используете CMSSignedDataGenerator, который предназначен для подписи для создания цепочки сертификатов p7b.

В более старой версии вы могли использовать null в качестве подписанных данных, но теперь вы должны ввести некоторые данные, даже если это просто пустой массив байтов.

person user3362334    schedule 21.12.2017