同一个 JVM 中的两个 SSLContext

Jon*_*ite 5 ssl jvm

当代码的另一部分调用 SSLContext.getInstance() 时,我们收到 SSL 握手异常。有人可以确认或否认使用同一提供程序在同一 JVM 中运行多个并发 SSLContext 的能力吗?方法名 getInstance 暗示了一个单例。

Bru*_*uno 7

是的,您可以拥有多个SSLContext实例,如果您愿意,可以进行不同的配置。

getInstance(...)通常是工厂模式的一部分,而不是单例模式,尽管单例模式的许多实现也使用工厂模式来访问这个单例。

此外,SSLContext.getInstance()不存在,只有getInstance(String), getInstance(String,String)or getInstance(String,Provider)(并且在getInstance方法上有参数对于单身人士来说几乎没有意义)。

(不要将此与 混淆SSLContext.getDefault(),它将始终返回当前的默认实例,尽管这也可以使用 进行全局更改setDefault(SSLContext)。)

以防万一你说SSLContext.getDefault()的是,值得注意的是,默认值SSLContext只会javax.net.ssl.*在第一次加载时读取和使用系统属性一次。如果您在代码中的某处设置这些属性,而不是在其他地方(或以不同方式)并SSLContext.getDefault()以不同的顺序调用,这可能会产生后果:第一次调用SSLContext.getDefault()wins(假设您没有进一步调用 使这复杂化SSLContext.setDefault(...))。

  • @ben 不确定您使用的是什么 JVM,但是如果您调用 `SSLContext sc1 = SSLContext.getInstance("TLS"); SSLContext sc2 = SSLContext.getInstance("TLS");`、`sc1` 和`sc2` 将*不是*同一个实例。 (2认同)