Ошибка при попытке зашифровать PDF с помощью itext: java.lang.SecurityException: класс "org.bouncycastle.asn1.ASN1Primitive" - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть приложение jee, где я генерирую PDF и показываю его пользователю в браузере. У меня есть просьба защитить PDF для печати, поэтому пользователь не может использовать документ иначе, чем для чтения. Я использую itext 5, и я пытался зашифровать документ, но я получаю ошибку: java.lang.SecurityException: класс "org.bouncycastle.asn1.ASN1Primitive" информация о подписывающем не совпадает с информацией о подписывающем устройстве других классов в том же пакете «

Я посмотрел несколько примеров для шифрования, даже в книге для itext5, но я не могу исправить эту ошибку. Я также посмотрел на некоторые решения моей проблемы, некоторые говорят, что это проблема зависимостей, возможно, дублированная, но я до сих пор не могу найти где, потому что мне даже не добавили надувной замок к моей поме.

Это выдержка из моего pom.xml веб-модуля.

<properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <itext.version>5.5.13</itext.version>
    </properties>

    <dependecies>
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>6.2</version>
        </dependency>
        <dependency>
            <groupId>javax.faces</groupId>
            <artifactId>javax.faces-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>${itext.version}</version>

        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-xtra</artifactId>
            <version>${itext.version}</version>

        </dependency>

    </dependencies>

The code I am trying to run is the next:

public void crearPDFconTextoHTML(String nombreArchivo, String texto) {
        try {
            String dirCarpetaTemp = directorio();//Creo el directorio temporal sin los archivos
            String dirFinalArchivo = dirCarpetaTemp + nombreArchivo;//Directorio completo del archivo
            FileOutputStream fos = new FileOutputStream(dirFinalArchivo);
            Document document = new Document(PageSize.A4);
            String USER_PASS = "Hello123";
            String OWNER_PASS = "Owner123";
            PdfWriter writer = PdfWriter.getInstance(document, fos);
            writer.setEncryption(USER_PASS.getBytes(), OWNER_PASS.getBytes(),
                    PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
            document.setMarginMirroring(true);
            document.open();

            Paragraph parrafo = new Paragraph();
            parrafo = convertirHtmlConFormatoAParrafoPdfOld(parrafo, texto);
//            parrafo = convertirTexto(parrafo, texto);

            parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
            document.add(parrafo);

            document.close();//cierro el documento
            writer.close();//cierro la escritura

            setNombreArchivo(nombreArchivo);//Agregar el nombre archivo final a la dependencia
//            OutputStream fos = new FileOutputStream(dirCarpetaTemp + nombreArchivo);//Crear archivo final
//            PdfTempUtil.doMerge(listPdfs, fos);//Combinar pdfs que se agregaron en la lista
            generarLinksAccesoAlPdf();//Generar la url que se mostrará en la lista
        } catch (DocumentException | IOException ex) {
            System.out.println(ex);
        }
    }

Зависимости должны быть в порядке, и шифрование должно работать, чтобы пользователь не мог распечатать PDF, когда он его открыл.

1 Ответ

1 голос
/ 09 апреля 2019

Зависимости должны быть в порядке [...]

Нет, проблема в зависимостях. Это могут быть не прямые зависимости, а транзитивные зависимости - которые являются зависимостями зависимостей (здесь мы говорим о детях, внуках и внуках [...] для сравнения) iText 5.5.13 требуется Bouncy Castle версии 1.49:

  <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk15on</artifactId>
      <version>1.49</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcpkix-jdk15on</artifactId>
      <version>1.49</version>
    </dependency>

Ваши основные лица имеют более старую версию iText

    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.1.7</version>
    </dependency>

который в свою очередь извлекает

<dependencies>
    <dependency>
        <groupId>bouncycastle</groupId>
        <artifactId>bcmail-jdk14</artifactId>
        <version>138</version>
    </dependency>
    <dependency>
        <groupId>bouncycastle</groupId>
        <artifactId>bcprov-jdk14</artifactId>
        <version>138</version>
    </dependency>
    <dependency>
        <groupId>bouncycastle</groupId>
        <artifactId>bctsp-jdk14</artifactId>
        <version>138</version>
    </dependency>
</dependencies>

Проверьте ваши зависимости (в вашем EAR) и убедитесь, что у вас правильная версия надувного замка. Иногда даже ваш сервер приложений приносит один. Если вы нашли виновного, то добавьте секцию <exclusion> к вашему пом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...