为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有啥区别

Posted

技术标签:

【中文标题】为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有啥区别【英文标题】:What is the difference between javax.net.ssl.keyStore and server.ssl.key-store properties when specifying keystore for a SpringBoot app为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有什么区别 【发布时间】:2020-07-19 05:01:53 【问题描述】:

    我能否使用这些属性中的任何一个来指定密钥库 - 特定于 Java 的 javax.net.ssl.keyStore 或特定于 Spring Boot 的 server.ssl.key-store。有什么不同吗?我想使用密钥库为我的应用程序使用 https 以及与一些 REST 服务的相互客户端身份验证提供服务

    如果密钥库未指定为属性或 jvm 参数,是否可以使用 https 服务 SpringBoot 应用程序,而是在启动时使用自定义代码读取?或者如果必须使用 https 提供应用程序,是否必须在此之前提供密钥库规范?

【问题讨论】:

曾经弄清楚我也在想同样的事情 【参考方案1】:

这两个属性具有互补的作用:

javax.net.ssl.keyStore 是 Java 安全提供程序用来配置默认 SSLContext系统 属性。大多数 SSL 客户端使用默认的SSLContext

您不需要将此属性作为 -D 参数传递给 JVM,您可以在应用程序启动的非常早期阶段以编程方式设置它,但我建议不要这样做:由于您的应用程序可能不是 JVM 中的唯一应用程序(例如,您将其作为 WAR 存档运行),您将影响其他应用程序的行为。请改用非默认的SSLContext

server.ssl.keyStore 是一个 Spring 属性,用于配置嵌入式 servlet 容器的 server 套接字。它可以来自many different sources。

虽然理论上 servlet 容器可以使用默认的 SSLContext 并从默认的 KeyManager 检索其证书(它从通过 javax.net.ssl.keyStore 指定的密钥库加载其密钥),但我不知道任何 servlet 容器实际上会这样做。

通常用作 SSL 客户端的证书与用作 SSL 服务器的证书不同。

【讨论】:

以上是关于为 SpringBoot 应用程序指定密钥库时 javax.net.ssl.keyStore 和 server.ssl.key-store 属性有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

将密钥添加到 Spring Boot 保险库

只能为 HMAC 签名指定 Base64 编码的密钥字节

将公共证书导入密钥库时出错

在 Azure 应用服务中具有信任库的 Spring Boot 容器

保护https密钥库时,Wildfly保险库(JCEKS)有什么意义?

使用多个读卡器加载 PKCS 密钥库时出错