Encryption 尝试使用itext:java.lang.SecurityException:class“org.bouncycastle.asn1.ASN1Primitive”加密PDF时出错

Encryption 尝试使用itext:java.lang.SecurityException:class“org.bouncycastle.asn1.ASN1Primitive”加密PDF时出错,encryption,jakarta-ee,itext,Encryption,Jakarta Ee,Itext,我有一个jee应用程序,在其中生成pdf并在浏览器上向用户显示。我要求保护pdf以供打印,因此用户除了阅读之外不能对文档进行任何其他用途。我使用的是itext 5,试图加密文档,但出现了一个错误:java.lang.SecurityException:class org.bouncycastle.asn1.asn1原语的签名者信息与同一包中其他类的签名者信息不匹配 我看了一些要加密的示例,甚至在itext5的书中也有,但我不能修复这个错误。我还研究了我的问题的一些解决方案,有人说这是一个依赖性问

我有一个jee应用程序,在其中生成pdf并在浏览器上向用户显示。我要求保护pdf以供打印,因此用户除了阅读之外不能对文档进行任何其他用途。我使用的是itext 5,试图加密文档,但出现了一个错误:java.lang.SecurityException:class org.bouncycastle.asn1.asn1原语的签名者信息与同一包中其他类的签名者信息不匹配

我看了一些要加密的示例,甚至在itext5的书中也有,但我不能修复这个错误。我还研究了我的问题的一些解决方案,有人说这是一个依赖性问题,可能重复了,但我仍然找不到地方,因为我甚至没有将bouncycastle添加到我的pom中

这是web模块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时就不能打印它

依赖关系应该很好[…]

不,问题在于依赖关系。这可能不是直接的依赖关系,而是依赖关系的依赖关系,我们在这里谈论的是孩子、孙子和孙辈[…]来进行比较 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>
primefaces具有较旧的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>

在耳朵里检查你的依赖关系,看看你是否有正确的bouncy castle版本。有时甚至你的应用服务器也会带来一个。如果发现了罪犯,请在pom中添加一个部分…

“我在maven中添加了2.1.7版,它可以正常工作!”!,糟糕的是,我已经在使用版本5了,所以我需要弄清楚是否必须更改一些代码才能使用版本2。顺便说一句,我不明白为什么primefaces没有上传到版本5,因为即使5是旧版本,7是实际版本。短版本:这可能是由于许可问题。iText2.X可以在商业环境中使用,无需付费,但5.X或7.X是AGPL,所以它们不是。另一种选择可能是OpenPDF 2.X的分支。。。