为 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 属性有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
在 Azure 应用服务中具有信任库的 Spring Boot 容器