【问题标题】:Can I reload trustmanager after opening serversocket in a ssl connection在 ssl 连接中打开 serversocket 后,我可以重新加载信任管理器吗
【发布时间】:2016-09-09 06:31:03
【问题描述】:
假设我已经创建了一个 SSLContext,从 serverSocketFactory 创建了一个 serverSocket,并且我已经开始接受连接。
类似:
SSLContext.getDefault().getServerSocketFactory().createServerSocket(1234).accept();
假设它运行了一段时间,现在我决定修改我的 TrustManager(添加/删除要信任的新证书)。是否可以在不关闭套接字并创建新的 SSLContext 的情况下执行此操作?
【问题讨论】:
标签:
java
sockets
ssl
serversocket
sslcontext
【解决方案1】:
您可以使用以下方法。
首先,您在创建 SSLContext 对象时保留它的引用。
SSLContext sslContext=SSLContext.getDefault();
sslContext.getServerSocketFactory().createServerSocket(1234).accept();
然后,当你想加载新的TrustManager时,可以再次调用init()方法,对应的TrustManager如下。
TrustManager trustManagers[] = // load trust managers here.
sslContext.init(null,trustManagers,null);
这里,init() 方法有 3 个参数,KeyManager[]、TrustManager[] 和 SecureRandom。如果您为其中任何一个传递null,则SSLContext 将加载默认的密钥管理器和信任管理器。由于您只想加载信任管理器,因此您必须将新的 TrustManager[] 传递给它。
由于您没有更改对 SSLContext 对象的引用,因此这不会中断您的流程或不会影响您现有的 SSLIOSessions。