【发布时间】:2022-12-06 23:30:56
【问题描述】:
我有一个使用 Spring Kafka starter 的 Java (11) Spring Boot 微服务(连同 Axual 包装器,但这可能不相关)。我的业务需要使用 SSL 对集群进行身份验证。我已经在本地进行了设置,并且一切正常。
但现在我的任务是以安全和适当的方式组织项目和配置,这主要包括将 SSL 密钥库、信任库和密码与源代码存储库分离。在我的本地设置中,我将它们作为 .jks 文件放在我的资源目录中。
当前用于存储机密的设置是使用我们使用 Spring 云连接到的 Spring Config 服务器。这个 SCS 有一个 Credhub 实例,可以用来存储秘密。在另一个使用 SSL 与第三方 API 建立 mTLS 连接的项目中,我将证书存储在这个 credhub 的 base64 中,然后在应用程序启动时将它们加载到一个 bean 中。在这里,我使用 Java.net.ssl SSLContext 类和 java.security Keystore 类在代码中构建一个密钥库和一个信任库,然后将 SSLContext bean 注入到 RestTemplate bean 中,没有详细说明,瞧,它已经配置好了。
我希望在 Spring kafka 中做类似的事情。但是,虽然 Spring RestTemplate 可以使用一堆工厂类来构造,这些工厂类在其基础上接受这个 SSLContext 对象,但我很难找到配置 ConsumerFactory 的方式,除非在 KafkaProperties 中提供一个指向已经创建的 . JKS 文件。
我一直在寻找用 Java 构建我的 SSLContext 或只是我的 KeyStore 对象,将其作为 Spring bean 注入并使用它来配置工厂。现在,KeyStore 类有一个“store(.., ..)”方法,可用于创建 .jks 文件——但这似乎是一种迂回的方式。这样做似乎有点老套。
在我看来,我有几个选择。
- A:找到一种方法将 SSL 配置作为 bean 注入并在代码中配置工厂
- B:在代码中加载java中的SSL配置,然后保存为文件供Spring Kafka正常加载
- C: 将管道中的 .jks 文件从安全位置注入到容器中
- D:通过另一种秘密存储解决方案在启动时将 .jks 文件注入到容器中
我更喜欢选项 A,因为我喜欢使用框架并加深我的理解。
选项 B 似乎,就像我说的,hacky。但也许这里有人会告诉我这完全没问题。然后我想知道如何最好地做到这一点。在返回 ConsumerFactory bean 之前,我是否只需调用 .store() ?我可以扩展或配置 SpringApplication.run() 以在加载所有其他 bean 之前执行密钥库文件的创建和存储吗?欢迎任何想法。
选项 C 和 D 将解决我的问题。它们甚至可能是更好的解决方案。但就我自己对框架的理解而言,如果你能帮我弄清楚 A(或可能是 B),我很乐意听听。如果那时结论仍然是“选择 C,你最好那样做”那么至少我知道它的来龙去脉。
【问题讨论】:
标签: spring-boot ssl spring-kafka