在多线程的情况下初始化 SSLContext

时间:2021-06-14 08:43:27

标签: java security ssl singleton

我正在尝试使用自定义信任库初始化 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();
}

0 个答案:

没有答案