Bouncy Castle Providers

    除此之外,Bouncy Castle 有许多能读取像 PEM 和 ASN.1 这些晦涩格式的工具。这些格式正常人是不会想去自己重写一遍的。

    在 Pulsar 中,安全与加密都对 BouncyCastle Jar 包有依赖。 关于Bouncy Castle FIPS的详细安装和配置,请参阅 BC FIPS 文档, 特别是 用户指南安全政策 PDF 文档。

    Bouncy Castle 提供 与 non-FIPS 两个版本。 但在 JVM 中,不能同时引入两个版本,所以需要先排除当前版本才能引入另一个版本。

    在 Pulsar 中,安全和加密方法也依赖于 Bouncy Castle, 特别是 TLS 认证 和 。 本文档包含使用 Pulsar 时的 Bounccastle FIPS(BC-FIPS)和 non-FIPS(BC-non-FIPS)版本的配置。

    Pulsar 中打包 Bounccastle 模块

    对于 Pulsar 中的bouncy-castle模块,我们提供了2个子模块:bouncy-castle-bc (针对 non-FIPS 版本)和bouncy-castle-bcfips(针对 FIPS 版本),将 BC jar 打包在一起,使 Bouncy Castle的包含和排除更容易。

    你可以在 mvn pom 文件中排除这些签名,以避免上面的错误:

    但它也可能引入新的加密报错,例如:java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available。可以通过像如下这样显式地指定在哪里找到加密算法:SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC")。这样做将会发现真正的报错信息:java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

    因此,我们需要使用 。它通过 jar-in-jar 方法将 BouncyCastle 的签名在一个单独的、可执行的 jar 包中。

    Pulsar 所用的bouncy-castle-bc模块,定义在bouncy-castle/bc/pom.xml文件内。它包含了 Pulsar 所需的 non-FIPS JAR包,该 JAR 包是使用 jar-in-jar 的方式打包的(即必须提供<classifier>pkg</classifier>)。

    1. <dependency>
    2. <groupId>org.bouncycastle</groupId>
    3. <artifactId>bcpkix-jdk15on</artifactId>
    4. <version>${bouncycastle.version}</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.bouncycastle</groupId>
    8. <version>${bouncycastle.version}</version>
    9. </dependency>

    通过使用 bouncy-castle-bc 模块,你可以轻松地将 Bouncycastle non-FIPS JAR 包引入或排除。

    默认情况下,pulsar-client-original包含了bouncy-castle-bc模块。并且pulsar-client-original已经包含在许多其他模块中,例如pulsar-client-adminpulsar-broker
    但是因为上面的 shade 包和签名的原因,我们将不会将bouncy-castle模块打包到pulsar-client-all的的其他 shade 模块目录中。例如pulsar-client-shaded, pulsar-client-admin-shadedpulsar-broker-shaded。 所以,在 shade 模块中,我们将排除 bouncy-castle模块。

    1. <filters>
    2. <filter>
    3. <artifact>org.apache.pulsar:pulsar-client-original</artifact>
    4. <includes>
    5. <include>**</include>
    6. </includes>
    7. <excludes>
    8. <exclude>org/bouncycastle/**</exclude>
    9. </filter>
    10. </filters>

    这意味着,bouncy-castle相关的 JAR 包不会被放在这些扩展的 Jar 包中。

    bouncy-castle/bcfips/pom.xml 中定义的 Pulsar 模块 bouncy-castle-bcfips,包含了Pulsar 所需的 FIPS jar 包。 和 bouncy-castle-bc类似, bouncy-castle-bfips也是用 jar-in -jar 方式打包,以便引入/排除包.

    如果你想要从 BC-non-FIPS 切换到 BC-FIPS 版本,下面是 Pulsar-broker 模块的一个示例:

    1. <dependency>
    2. <artifactId>pulsar-broker</artifactId>
    3. <version>${pulsar.version}</version>
    4. <exclusions>
    5. <exclusion>
    6. <groupId>org.apache.pulsar</groupId>
    7. <artifactId>bouncy-castle-bc</artifactId>
    8. </exclusion>
    9. </exclusions>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.apache.pulsar</groupId>
    13. <artifactId>bouncy-castle-bcfips</artifactId>
    14. <version>${pulsar.version}</version>

    更多的示例, 您可以参考 bcfips-include-test模块。