BouncyCastle 介绍

Bouncy Castle 是一个完善了默认 Java 加密拓展(JCE)的 Java 库,它比 Sun 提供的默认 JCE 多提供了许多密钥套件与算法。

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

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

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

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

引入 BC-non-FIPS 的依赖

默认情况下,Bouncycastle 的 non-FIPS 版本与 Pulsar Broker 和 Java 客户端一起构建。

bouncy-castle/bc/pom.xml 中定义的 Pulsar 模块 bouncy-castle-bc,包含了Pulsar 所需的 non-FIPS jar 包。

  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. <artifactId>bcprov-ext-jdk15on</artifactId>
  9. <version>${bouncycastle.version}</version>
  10. </dependency>

By using this bouncy-castle-bc module, user can easily include and exclude BouncyCastle non-FIPS jars.

Pulsar 客户端和 Broker 在 BC-non-FIPS 上的依赖

Pulsar 客户端(pulsar-client-original) 模块可以通过以下方式添加依赖来引入 BouncyCastle non-FIPS jar 包:

  1. <dependency>
  2. <groupId>org.apache.pulsar</groupId>
  3. <artifactId>bouncy-castle-bc</artifactId>
  4. <version>${project.parent.version}</version>
  5. </dependency>

Pulsar Broker (pulsar-broker) 模块可以通过间接引入 Pulsar 客户端(pulsar-client-original) 模块来引入 BouncyCastle non-FIPS jar 包。

  1. <dependency>
  2. <groupId>org.apache.pulsar</groupId>
  3. <artifactId>pulsar-client-original</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>

排除 BC-non-FIPS 并引入 BC-FIPS

在理解上述依赖后,用户可以轻松地排除 non-FIPS 版本,并引入 FIPS 版本。

BC-FIPS

bouncy-castle/bcfips/pom.xml 中定义的 Pulsar 模块 bouncy-castle-bcfips,包含了Pulsar 所需的 FIPS jar 包。

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

用户可以选择直接引入模块 bouncy-castle-bfips,或者引入原生的 BC-FIPS jar 包。

例如:

  1. <dependency>
  2. <groupId>${project.groupId}</groupId>
  3. <artifactId>pulsar-broker</artifactId>
  4. <version>${project.version}</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>${project.groupId}</groupId>
  8. <artifactId>bouncy-castle-bc</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <!--exclude bouncy castle non-FIPS version, then load fips version-->
  13. <dependency>
  14. <groupId>org.bouncycastle</groupId>
  15. <artifactId>bc-fips</artifactId>
  16. <version>${bouncycastlefips.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.bouncycastle</groupId>
  20. <artifactId>bcpkix-fips</artifactId>
  21. <version>${bouncycastlefips.version}</version>
  22. </dependency>

除此之外,bouncy-castle-bcfips 模块构建会包含一个 NAR 格式的输出,你可以通过 -DBcPath='nar/file/path' 设置 java 环境,Pulsar 会自动载入它。

更多的示例可以参考模块 bcfips-include-testbcfips-nar-test