如何强制 tomcat 重新加载受信任的证书?

Art*_*tch 5 java security ssl tomcat keystore

我的 Web 应用程序使用 2 向 SSL 连接器(也称为“客户端身份验证”):

<Connector port="8084" SSLEnabled="true" maxThreads="10" minSpareThreads="3" maxSpareThreads="5"
             enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true"
             clientAuth="true" truststoreFile="conf/keystore.kst" truststoreType="JCEKS" sslProtocol="TLS" URIEncoding="UTF-8"
             keystoreFile="conf/keystore.kst" keystoreType="JCEKS" keyAlias="myAlias"
             ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA"/>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当 Tomcat 服务器正在运行并且我使用新的受信任证书更新密钥库,甚至从中删除受信任证书时,连接器不会注意到这些更改。

到目前为止我尝试过的:

1)停止、重新初始化(反射)和启动连接器 - 不起作用。

2) 实现我自己的 SSLContext,从密钥库重新加载证书。好吧,这里我遗漏了向 tomcat 注册此 SSLContext 的部分(以便 tomcat 将在连接器中使用它来进行新的传入连接)

关于这个问题有很多帖子,但没有真正的解决方案:

http://www.delphifaq.com/faq/f5003.shtml

http://jcalcote.wordpress.com/tag/truststore
(本文仅介绍如何从客户端重新创建 SSLcontext(缺少服务器端))

有任何想法吗?

还有另一个相关问题:

如何强制 Tomcat Web 应用程序在更新后重新加载信任存储

但答案还不够,因为我不想构建新的类加载器。

谢谢。

Max*_*lov 0

如果您的连接器将bindOnInit属性设置为false(从 Tomcat 6.x 开始存在),则:

控制何时绑定连接器使用的套接字。默认情况下,当连接器启动时它被绑定,当连接器被销毁时它被解除绑定。如果设置为 false,则套接字将在连接器启动时绑定,并在连接器停止时解除绑定。

来自org.apache.tomcat.util.net.AbstractEndpoint Tomcat 8.0.29的代码片段:

public final void start() throws Exception {
    if (bindState == BindState.UNBOUND) {
        bind();
        bindState = BindState.BOUND_ON_START;
    }
    startInternal();
}

public final void stop() throws Exception {
    stopInternal();
    if (bindState == BindState.BOUND_ON_START) {
        unbind();
        bindState = BindState.UNBOUND;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在更新密钥和信任存储后通过 JMX 停止和启动连接器。