当前位置: 首页 > 知识库问答 >
问题:

spring boot:单向SSL强制客户端密钥存储配置

明越
2023-03-14

让我以Java安全不是我精通的一个领域作为前言。

我有许多通过REST调用进行通信的spring boot服务。当我配置为使用SSL/HTTPS时,我需要为各种证书文件和相关信息提供访问和配置。目前,我们只做单向验证。双向核查可能会在稍后时间进行。

我对单向验证如何工作的理解是,客户端可以访问信任存储区,该存储区包含关于它将与之交互的任何服务器的公钥信息。一个给定的服务器将有一个包含其密钥信息的密钥存储(我假设同时是公共的和私有的)。当客户端尝试调用服务器时,两者之间会交换一些关键信息,客户端会验证服务器的关键信息是否包含在其信任存储中。如果是这样,一切都是好的,进程继续进行。如果不是,则拒绝呼叫。我还认为客户机不需要密钥存储信息,因为它不会被任何东西调用。

当我将服务配置为使用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>

上面是一个服务器服务的示例。我认为,一个从不调用任何其他东西的“服务器”服务不需要信任存储信息。

对于一个从未被任何东西调用的客户端服务,我认为我应该能够省略密钥存储相关的信息。如下所示:

server:
  port: <some port>
  ssl:
    enabled: true
    protocol: TLS
    trust-store-type: JKS
    trust-store: classpath:server.truststore
    trust-store-password: <password>

显然它需要信任存储信息,但我认为不应该需要任何密钥存储信息,因为它不需要。

但是,我不允许这样做。如果我试图省略密钥存储属性,应用程序将失败,抱怨它无法加载密钥存储'null'。如果启用SSL,spring boot应用程序的启动过程似乎需要指定密钥存储属性,而不管是否需要它。

有办法解决这个问题吗?

共有1个答案

澹台硕
2023-03-14

一种方式ssl与spring boot应用作为消费者,例如一个REST服务消费者,只需要建立信任存储,不需要根据PKI基础设施的密钥存储。但是,如果您选择使用application.properties来指定信任存储,那么您还必须指定密钥存储,这有点奇怪,但是如果您可以使用以下两段代码在代码中指定信任存储,则可以解决此问题

System.setProperty("javax.net.ssl.trustStore", new File("YourTrustStore.jks").getAbsolutePath() );

使用keytool创建信任存储区

keytool -keystore YourTrustStore.jks -alias MyCA -import -file C:/temp/ca.cer
 类似资料:
  • 我使用。NET Core2.0和ASP.NET Core2.0进行应用程序开发。“测试”应用程序是一个。NET核心控制台应用程序。我正在编写的核心代码是一个类库。一旦适当的测试。我选择这样做是因为我暂时不会使用它(它正在替换旧的ASPNET代码)。 无论如何,由于我必须处理各种服务的大量API密钥,所以我决定使用Microsoft Azure Key Vault来存储密钥。我有这一切设置,并理解这

  • 客户端存储

  • 谷歌云SQL通过为您生成服务器和SSL连接。我通过以下步骤设法让我的Java客户端连接到云SQL: 1)将服务器CA证书导入信任库文件: 2) 将客户端证书和客户端密钥捆绑到pkcs12文件中: 3)将pkcs12导入密钥库文件: 4)告诉JVM使用我的信任库和密钥库: 这一切都有效,但不幸的是,它排除了来自其他客户端库的出站HTTPS连接——在我的例子中,是Firebase java客户端库。问

  • 我有一个spring boot应用程序,它调用一个支持ssl的rest服务,该服务需要相互ssl身份验证。我需要指定一个密钥存储和信任存储来在此客户端应用程序中进行调用。 当我在Java代码中指定keystore和trust store信息(key和trust store jks文件的路径、类型和密码)时,如下所示,调用就起作用了。 但是我怎么用application.yaml. 我尝试了下面的模

  • 我的客户端应用程序生成的数据在设备上加密。加密密钥通过HTTPS发送给Azure函数,该函数使用Azure密钥库存储加密密钥,以便其他授权的客户机可以获得加密密钥并解密数据。 下面是我的Azure函数中执行将加密密钥(秘密)保存在密钥库中的工作的一段代码: 问题 这样的设计是不是对Azure Key Vault的适当使用?

  • 我想通过postman中的api将角色添加到特定客户端密钥斗篷中的用户,但我得到了“错误”:“client not Found”这个URL:post-http://localhost:8080/auth/admin/realms/{realmName}/users/{userId}/role-mappings/clients/{clientId} 本机构: