gpt4 book ai didi

java - SSLContext 和 SSLSocketFactory createSocket 线程安全吗?

转载 作者:行者123 更新时间:2023-12-04 11:15:35 26 4
gpt4 key购买 nike

在我的测试中,我可以毫无问题地使用这两种方法,但我找不到说明 SSLSocketFactory.createSocket() 是否是线程安全的文档。
可以在多个线程中使用相同的 SSLSocketFactory 来创建 SSL 套接字吗?

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

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

最佳答案

这个问题不能这么容易回答。原因是有执行,也有合约层面。
实现
SSLServerSocketFactory 类是抽象的,具有插件扩展机制。因此,从理论的角度来看,您无法确定自己的实现方式。
默认实现只是一个虚拟实现,并由 JVM 选择的提供者的实现实例进行交换:

//
// The default factory does NOTHING.
//
class DefaultSSLServerSocketFactory extends SSLServerSocketFactory {
...
}
抽象类中有一些同步的迹象。
为了回答 JDK 中的实现,需要针对每个操作系统(Windows、Linux、Mac OS)上的每个 JDK 版本分析这个问题。
当您在下一节中谈到契约(Contract)级别时,关键部分(同步)的存在毫无意义。从我的角度来看,契约(Contract)级别是本次讨论的重点。
契约(Contract)
事实上,如果没有 API 文档保证/ promise 它是线程安全的。所以,理论上它不是。您不能依赖任何没有 API 契约(Contract)的东西。请阅读 this reference到 Josh Blochs 的“黄金法则 70:记录线程安全”中,对有关依赖线程安全的假设进行了非常详细的讨论。
我可以使用上面提到的扩展机制编写一个非线程安全的 SSLServerSocketFactory 实现。缺乏线程安全不会是一个错误,因为它不是每个接口(interface)契约(Contract)的强制性要求。
总结
总而言之,API 并不能保证所有实现都是线程安全的。所以没有办法说会有一个( future 的)实现不是线程安全的。

关于java - SSLContext 和 SSLSocketFactory createSocket 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44955086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com