首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLContext和SSLSocketFactory createSocket线程安全吗?

SSLContext和SSLSocketFactory createSocket线程安全吗?
EN

Stack Overflow用户
提问于 2017-07-06 17:05:35
回答 1查看 1.8K关注 0票数 10

在我的测试中,我能够在没有问题的情况下使用这两种方法,但是我找不到说明wheter ()是否是线程安全的文档。是否可以在多个线程中使用相同的SSLSocketFactory来创建SSL套接字?

我的应用程序使用了一个处理将纯文本套接字升级到SSL的类:

代码语言:javascript
复制
public class SSLHandler() {
    public Socket upgradeToSSL(Socket plainSocket) {
        SSLSocket sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManager = new TrustManager[]{
            new MyOwnTrustManager()
        };

        sslContext.init(null, trustManager, null);
        SSLSocketFactory sslsocketfactory = sslContext.getSocketFactory();

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(
                    remoteSocket,
                    remoteSocket.getInetAddress().getHostAddress(),
                    remoteSocket.getPort(),
                    true);

        return sslSocket;
    }
}

SSLHandler类用于如下所示的多个线程:

代码语言:javascript
复制
Socket plainSocket = new Socket(host, port);
//Do some stuff in plain text...

//Lets use TLS now
SSLHandler sslHandler = new SSLHandler();
sslHandler.upgradeToSSL(Socket plainSocket);

plainSocket = upgradeToSSL(plainSocket);

因此,为每个新线程创建一个SSLHandler。为了避免这种情况,我考虑使用Singleton模式重构SSLHandler:

代码语言:javascript
复制
public class SingletonSSLHandler() {
    private SSLSocket sslContext;
    private SSLSocketFactory sslSocketFactory;

    //GetInstance() and etc.

    private SingletonSSLHandler() {
        sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManager = new TrustManager[]{
            new MyOwnTrustManager()
        };

        sslContext.init(null, trustManager, null);
        sslSocketFactory = sslContext.getSocketFactory();
    }

    public static Socket upgradeToSSL(Socket plainSocket) {

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(
                    remoteSocket,
                    remoteSocket.getInetAddress().getHostAddress(),
                    remoteSocket.getPort(),
                    true);

        return sslSocket;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-10 21:07:08

这个问题不能这么轻易地回答。究其原因,既有实施上的原因,也有合同层面的原因。

Implementation

SSLServerSocketFactory类是抽象的,具有插件扩展机制。因此,您不能确定从理论的角度来看您正在实现什么。

默认实现只是一个虚拟实现,由JVM选择的提供者的实现实例进行交换:

代码语言:javascript
复制
//
// The default factory does NOTHING.
//
class DefaultSSLServerSocketFactory extends SSLServerSocketFactory {
...
}

在抽象类中有一些同步的迹象。要回答JDK中的实现问题,需要对每个操作系统(Windows、Linux、Mac )上的每个JDK版本进行分析。

当您进入下一节的合同级别时,板球部分(同步)的存在没有任何意义。从我的角度来看,合同水平是这次讨论中最重要的。

合同

事实上,如果没有API文档来保证/承诺它是线程安全的。所以,从理论上讲,事实并非如此。您不能依赖任何您没有API契约的东西。请阅读本参考给Josh Blochs的“黄金规则70:文档线程安全”,以获得关于依赖线程安全的假设的详细讨论。

我可以使用上面提到的扩展机制编写一个非线程安全的SSLServerSocketFactory实现。缺乏线程安全并不是一个错误,因为它不是每个接口契约的强制要求。

摘要

总之,API并不保证所有的实现都是线程安全的。因此,没有办法说将来会有一个(未来)实现,而不是线程安全。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44955086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档