默认SSL Context定义、配置规则及可配置数量相关问题咨询
基础概念
- 默认SSL Context:是JVM层面全局共享的SSL配置实例,作为所有未显式指定SSL配置的加密连接的默认兜底配置,内部封装了密钥库、信任库、TLS版本、加密套件等核心SSL握手参数。
- 可配置的SSL Context数量上限:没有固定数值限制,只要JVM内存足够,就可以创建任意多个独立的SSL Context实例。
默认SSL Context的创建逻辑
创建时机
不是只有调用SSLContext.setDefault()才会创建。默认实例会在第一次调用SSLContext.getDefault()方法时懒加载初始化,如果之前没有主动调用setDefault设置自定义实例,JVM会自动生成默认实例。
系统启动参数的影响
如果启动时传入了-Djavax.net.ssl.keyStore、-Djavax.net.ssl.trustStore这类系统参数,自动生成的默认SSL Context会直接读取这些参数配置的密钥库、信任库来完成初始化。
Tomcat配置的影响
常规配置下Tomcat不会修改JVM的全局默认SSL Context。Tomcat的keystoreFile配置只会用来初始化它自己内部用于HTTPS监听端口的SSL Context实例,不会主动调用SSLContext.setDefault()覆盖全局默认值,除非你手动修改了Tomcat的启动代码或者添加了额外的初始化逻辑。
HTTPS访问的默认使用逻辑
如果直接使用JDK原生的HttpsURLConnection发起HTTPS请求,没有显式设置自定义的SSLSocketFactory的话,默认会使用全局默认SSL Context的配置完成握手。
不过很多第三方HTTP客户端(比如OkHttp、Apache HttpClient)如果有自己的默认配置逻辑,可能不会直接用JVM的全局默认SSL Context,具体要看客户端的实现规则。
自定义SSL Context的独立性
完全可以新建独立的SSL Context且不影响原有默认配置。你可以通过SSLContext.getInstance("TLS")获取新的实例,然后用自定义的密钥库、信任库参数调用init()方法完成初始化,这个新实例和全局默认SSL Context是完全隔离的,只要你不主动把它设置为全局默认,就不会对原有配置产生任何影响。不同业务场景的加密连接可以各自使用独立的SSL Context,互不干扰。
内容的提问来源于stack exchange,提问作者Diego Ramos

