java - Spring 启动 : One-way SSL forces key store configuration on client side

标签 java spring-boot ssl

让我先说明一个事实,即 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/

相关文章:

java - 让音序器在 JavaSound (Java SE7) 中播放

java - 如何使用规范在mysql查询中使用多个 "OR"条件创建两个 "AND"条件

java - OpenJDK 11或AdoptOpenJDK是否像Oracle JDK一样稳定

java - 修改build.xml为tomcat的另一个路径

java - Maven 无法使用 Eclipse 解决 Jacob 依赖关系

spring-boot - 找不到资源和ControllerLinkBuilder并已弃用

apache - 破坏绿色 SSL 栏的不安全图像

javascript - 如何在 Javascript 中检测 SSL 证书并将其添加到浏览器?

docker - 将 SSL 证书添加到网站到 Docker

java - Clojure中的线程局部变量