我正在尝试使用自定义信任库初始化 SSLContext,并将密钥库和 secureRandom 保持为默认值。对于自定义信任库,我有一个 JKS 文件,我将用它来初始化 TrustManager。 这是一个服务器应用程序,它将获得多个并发请求。我无法理解我们是否应该使用单例 SSLContext/SSLSocketFactory。基于 Are SSLContext and SSLSocketFactory createSocket thread safe?,看起来我们应该为每个请求创建新对象。但是,下面的实现将导致加载信任库和为每个请求创建 SSL 对象的高延迟。这种理解是否正确?
此外,如果我能理解在这种情况下如何检查特定对象是否可以是单例对象,那将非常有帮助?在文档中,我通常会寻找关于线程安全的提及,但在 SSLContext/SSLSocketFactory 的 oracle 文档中找不到任何此类信息。
URL url = new URL(endpoint);
connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(getDefaultSSLSocketFactory());
public SSLSocketFactory getDefaultSSLSocketFactory() {
String path = "path to truststore";
try (FileInputStream fis = new FileInputStream(path)) {
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(fis, "password".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(clientKeyStore);
sslcontext.init(null, trustManagerFactory.getTrustManagers(), null);
return sslcontext.getSocketFactory();
}