什么是默认 SSL 上下文以及可以配置多少个 SSL 上下文?
What is a default SSL Context and how many SSL Contexts can be configured?
在 java 中我们有 javax.net.ssl.SSLContext.getDefault() 被描述为:Returns 默认 SSL 上下文。
这让我思考以下问题:
默认 SSL 上下文何时创建?这是否仅在调用 setDefault(SSLContext context) 时发生?那我们传递 -Djavax.net.ssl.keyStore=mykeystore.jks 的情况呢?默认的 ssl 上下文是基于这个密钥库创建的吗?另外,在像 Tomcat 这样的服务器环境中会发生什么? Tomcat 是否根据 keystoreFile="/keystore/tomcatkeystore.jks?
中配置的内容设置默认 ssl 上下文?
当我们尝试使用任何 https 端点时,使用的是默认上下文吗?
在处理需要不同组的安全连接时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
。这些实现相同的结果,但您的代码略有不同。
在 java 中我们有 javax.net.ssl.SSLContext.getDefault() 被描述为:Returns 默认 SSL 上下文。
这让我思考以下问题:
默认 SSL 上下文何时创建?这是否仅在调用 setDefault(SSLContext context) 时发生?那我们传递 -Djavax.net.ssl.keyStore=mykeystore.jks 的情况呢?默认的 ssl 上下文是基于这个密钥库创建的吗?另外,在像 Tomcat 这样的服务器环境中会发生什么? Tomcat 是否根据 keystoreFile="/keystore/tomcatkeystore.jks?
中配置的内容设置默认 ssl 上下文?当我们尝试使用任何 https 端点时,使用的是默认上下文吗?
在处理需要不同组的安全连接时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
。这些实现相同的结果,但您的代码略有不同。