什么是默认 SSL 上下文以及可以配置多少个 SSL 上下文?

What is a default SSL Context and how many SSL Contexts can be configured?

在 java 中我们有 javax.net.ssl.SSLContext.getDefault() 被描述为:Returns 默认 SSL 上下文。

这让我思考以下问题:

  1. 默认 SSL 上下文何时创建?这是否仅在调用 setDefault(SSLContext context) 时发生?那我们传递 -Djavax.net.ssl.keyStore=mykeystore.jks 的情况呢?默认的 ssl 上下文是基于这个密钥库创建的吗?另外,在像 Tomcat 这样的服务器环境中会发生什么? Tomcat 是否根据 keystoreFile="/keystore/tomcatkeystore.jks?

    中配置的内容设置默认 ssl 上下文?
  2. 当我们尝试使用任何 https 端点时,使用的是默认上下文吗?

  3. 在处理需要不同组的安全连接时keystores/configuration我们能否创建新的 SSL 上下文而不影响已经为默认 ssl 上下文配置的内容?

感谢您的帮助。

When is the Default SSL Context created? Does this happen only while calling setDefault(SSLContext context)?

没有。如果您使用 setDefault(IME 很少见),您需要区分默认的两个 'levels':

  • .getDefault 返回的对象 -- 这可以称为 'current default'。它 可以 .setDefault 设置,在这种情况下,您可以控制对象集及其创建,或者它 可以 自动创建,请参阅接下来。

  • 调用 .getDefault 时自动在内部创建的对象,而无需事先设置值。这可以称为 'created default',或者可能是 'default default' (!) 创建后,此对象将设置为默认值,因此 second 调用 .getDefault 回到第一个项目符号下。

大多数程序不使用 .setDefault,因此如果它们根本不使用 .getDefault(他们可能不使用),那么第一个调用转到第二个项目符号,随后调用第一个项目符号。

注意 .getDefault 被许多库、平台和中间件隐式调用,因此您不能仅仅因为您不编写这样的调用就假设它不会发生(并且可能调用第二颗子弹)。

What about the case where we pass -Djavax.net.ssl.keyStore=mykeystore.jks? Is the default ssl context created based on this keystore?

在第二个项目符号中 -- 当您 设置默认值并且自动创建默认值时,是的。更确切地说,'created default' 使用 sysprops javax.net.ssl.keyStore* 和 ...trustStore*(如果已设置);如果不是,它将信任库默认为文件 JRE/lib/security/cacerts(或 jssecacerts,如果存在,这种情况很少见),密钥库默认为 none/empty.

如果您明确设置默认值,则可以控制其中的内容;如果您愿意,您可以使用这些系统道具。

Does Tomcat set the default ssl context based on what is configured in keystoreFile="/keystore/tomcatkeystore.jks?

没有。它设置 a 上下文(可能不止一个)用于处理传入的 HTTPS 连接,但那是(或那些)不是 default上下文。

When we try to consume any https endpoint is the Default Context the one that is used?

也许吧。 'consume ... https' 有成千上万种方法,而且它们可能各不相同。其中一些可能总是使用默认上下文;许多人有时会使用默认值,有时则不会;有些人可能永远不会使用默认值。没有更具体的问题是不可能说的。

When dealing with secure connections that require different set of keystores/configuration can we create new SSL Contexts without affecting what is already configured for the default ssl Context?

当然可以,这正是您应该做的。请注意,有些连接方法直接使用 SSLContext,而有些(主要是为了与 non-SSL/TLS 连接更兼容)使用 [SSL]SocketFactory[SSL]ServerSocketFactory 创建并链接到 SSLContext。这些实现相同的结果,但您的代码略有不同。