当前位置: 首页 > 知识库问答 >
问题:

SSLContext和SSLSocketFactory createSocket线程安全吗?

申嘉慕
2023-03-14
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类在多个线程中使用,如下所示:

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。为了避免这种情况,我考虑使用单例模式重构SSLHandler:

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;
    }
}

共有1个答案

祁烨
2023-03-14

这个问题不是那么容易回答的。究其原因,有执行,更有合同层面。

实施

SSLServerSocketFactory类是抽象的,具有插件扩展机制。所以你不能确定从理论的角度来看你的实现是什么。

//
// The default factory does NOTHING.
//
class DefaultSSLServerSocketFactory extends SSLServerSocketFactory {
...
}
 类似资料:
  • 问题内容: 我正在寻找关于线程安全信息和。官方文档(http://docs.python.org/library/urllib2.html和http://docs.python.org/library/httplib.html)缺少有关此主题的任何信息。那里甚至没有提到 线程 一词… 更新 好的,它们不是线程安全的。使它们具有线程安全性需要什么,或者存在使它们具有线程安全性的情况?我问是因为好像

  • 问题内容: 我经常听到对Swing库中缺乏线程安全性的批评。但是,我不确定自己将在自己的代码中执行的操作会导致问题: 在什么情况下,Swing不是线程安全的事实起作用? 我应该积极避免做什么? 问题答案: 切勿执行长时间运行的任务以响应按钮,事件等,因为这些事件在事件线程上。如果您阻止事件线程,则整个GUI将完全无响应,从而使用户感到非常生气。这就是为什么Swing看起来缓慢又硬朗。 使用线程,执

  • 该项目是使用Play framework和Scala语言编写的。我已经实现了编译时依赖关系。我在游戏中遵循了以下示例: https://github.com/playframework/play-scala-compile-di-example 查看MyApplicationLoader。scala: 以及以下代码行: 我的理解是,在第一次调用HomeController时,只创建了一个HomeC

  • 问题内容: 我目前有一个项目,该项目使用杰克逊更快的xml使用自定义序列化器和反序列化器将POJO序列化/反序列化到Json。据我了解,一旦创建并配置了ObjectMapper,它就是线程安全的。但是,我注意到使用JMeter运行测试时,偶尔会发生以下情况- 线程1进入CustomerSerializer并开始序列化 线程2进入CustomSerializer,与线程1交互,并开始从头到尾进行序列

  • 问题内容: 在多个类中,是否是线程安全的? 问题答案: 尽管EntityManager实现本身不是线程安全的,但是Java EE容器注入了一个代理,该代理将所有方法调用委托给与事务绑定的EntityManager。因此,每个事务都使用其自己的EntityManager实例。至少对于事务范围的持久性上下文而言,这是正确的(默认设置)。 如果容器将在每个bean中注入EntityManager的新实例

  • 我的Spring项目中有一个简单的: 并按如下方式使用: 我是否必须注意线程安全并使同步(因为不是线程安全的)?我不确定到底是如何工作的--它是否只创建跨所有线程的单个序列化实例?还是为每个转换创建单独的实例?