让我先说明一个事实,即 Java 安全性不是我精通的领域。
我有许多通过 REST 调用进行通信的 Spring Boot 服务。当我配置使用SSL/HTTPS时,我需要提供各种证书文件和相关信息的访问和配置。目前,我们只进行单向验证。双向验证可能会在稍后进行。
我对这如何用于单向验证的理解是,客户端可以访问一个信任库,其中包含有关它将与之交互的任何服务器的公钥信息。给定的服务器将有一个包含其 key 信息的 keystore (我假设是公共(public)的和私有(private)的)。当客户端尝试调用服务器时,两者之间会交换一些关键信息,客户端会验证服务器的关键信息是否包含在其信任库中。如果是这样,一切都很好,过程继续进行。如果不是,则调用被拒绝。我也觉得客户不需要 key 存储信息,因为它不会被任何东西调用。
当我配置服务使用 SSL 时,我需要设置一些 SSL 属性,如下所示:
server:
port: <some port>
ssl:
enabled: true
protocol: TLS
trust-store-type: JKS
trust-store: classpath:server.truststore
trust-store-password: <password>
key-store-type: JKS
key-store: classpath:server.keystore
key-store-password: <password>
key-alias: <alias>
以上是服务器服务的例子。稍微切线一点,我认为从不调用任何其他东西的“服务器”服务不需要信任存储信息。
对于一个永远不会被任何东西调用的客户端服务,我认为我应该能够省略与 keystore 相关的信息。类似于以下内容:
server:
port: <some port>
ssl:
enabled: true
protocol: TLS
trust-store-type: JKS
trust-store: classpath:server.truststore
trust-store-password: <password>
显然它需要信任存储信息,但我认为不应该需要任何 key 存储信息,因为它不需要。
但是,我不允许这样做。如果我试图省略 keystore 属性,应用程序将失败并提示它无法加载“null” keystore 。 Spring Boot 应用程序启动过程似乎需要在启用 SSL 的情况下指定 key 存储属性,无论是否需要。
有没有办法解决这个问题?
最佳答案
将 Spring Boot 应用程序用作消费者(例如 REST 服务消费者)的 ssl 的一种方式,根据 PKI 基础设施,只需要设置信任库,不需要 keystore 。但是,如果您选择使用 application.properties 来指定信任库,则还必须指定一个 keystore ,这有点奇怪,但是如果您可以使用以下两个在代码中指定信任库,则有一个解决方法任何地方的一段代码
System.setProperty("javax.net.ssl.trustStore", new File("YourTrustStore.jks").getAbsolutePath() );
使用 key 工具创建信任库
keytool -keystore YourTrustStore.jks -alias MyCA -import -file C:/temp/ca.cer
关于java - Spring 启动 : One-way SSL forces key store configuration on client side,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59292012/