【问题标题】:using custom keystore and jsseimplementation when upgrading to tomcat 8.5升级到 tomcat 8.5 时使用自定义密钥库和 jsse 实现
【发布时间】:2017-01-02 01:29:53
【问题描述】:

我们使用自己的自定义密钥库,还使用 ​​JSSEImplementation 和 ServerSocketFactory 提供了自定义类实现,并在 server.xml 中为“store”和“sslImplementation”属性进行了配置。

但是现在升级到 8.5,我开始收到很多 ClassNotFoundException for JSSESocketFactory 等。
再做一些研究,我发现他们已经删除了许多类和方法,如 JSSESocketFactory.java、getServerSocketFactory()、getSSLUtil(AbstractEndpoint endpoint) 等。

所以现在,我的问题是:
在 apache tomcat 8.5 中有什么方法可以在 server.xml 的“存储”下配置我的自定义密钥库并使用我自己的 sslImplementation?
我在方法签名中使用 AbstractEndpoint 来获取在server.xml 中设置的商店名称,然后像这样在 MyJSSESocketFactory 中加载该密钥库:

public class MySSLImplementation extends JSSEImplementation 
{ 
@Override
    public org.apache.tomcat.util.net.ServerSocketFactory getServerSocketFactory(
            AbstractEndpoint endpoint) {
        kStore = endpoint.getProperty("store");
        return new MyJSSESocketFactory(endpoint, kStore);
    }
}

public class MyJSSESocketFactory extends JSSESocketFactory {

    private final AbstractEndpoint _endpoint;
    private final String store;

    public MyJSSESocketFactory(AbstractEndpoint endpoint, String store) {
        super(endpoint);
        this._endpoint = endpoint;
        this.store = store;
    }
    /*
     * Gets the SSL server's keystore.
     */
    @Override
    protected KeyStore getKeystore(String type, String provider, String pass)
            throws IOException {

        if ("MYKS".equalsIgnoreCase(type)) {

            String keystoreName = store;
            KeyStore ks = null;
            try {
                if (provider == null || provider.isEmpty()) {
                    ks = KeyStore.getInstance(type);
                } else {
                    ks = KeyStore.getInstance(type, provider);
                }

                MyStoreParameter params = new MyStoreParameter(
                        keystoreName);
                ks.load(params);
            } catch (Exception ex) {
                throw new IOException(
                        "Failed to load keystore " + keystoreName, ex);
            }
            return ks;
        } else {
            return super.getKeystore(type, provider, pass);
        }
    }
}

在 server.xml 中为“store”属性设置“MYKS”

【问题讨论】:

  • 嗨:我相信答案是“是”,解决方案是使用 JSSE 定义您自己的自定义(与现在显然已经过时的 Tomcat API 相比)。我只能找到一篇关于如何做到这一点的文章:angelfire.com/or/abhilash/site/articles/jsse-km/…
  • 我很好奇...你为什么需要自己的SocketFactory

标签: java tomcat jsse


【解决方案1】:

不管它值多少钱,这就是破坏它的提交:

Remove BIo specific JSSE code

以下是删除它的一些理由:

https://github.com/spring-projects/spring-boot/issues/6164

@markt-asf 8.5.3 中似乎有许多重大更改 (从 8.0.33 升级):

  1. Maven 工件 org.apache.tomcat.embed:tomcat-embed-logging-juli 不再存在
  2. org.apache.tomcat.util.net.ServerSocketFactory 类不再存在
  3. org.apache.tomcat.util.net.jsse.JSSESocketFactory 类不再存在
  4. 方法 JSSEImplementaton.getServerSockerFactory(AbstractEndpoint) 不再存在
  5. 方法 JSSEImplementaton.getSSLUtil(AbstractEndpoint) 不再存在
  6. Http11NioProtocol.getEndpoint() 不再可见
  7. 字段 org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML 不再存在
  8. AbstractHttp11Protocol.setCompressableMimeTypes 不再存在

回复:

1 只需要通过 log4j 1.x 启用容器日志记录,并且 log4j 社区不再支持 version。 log4j 2.x 可以 无需任何额外库即可用于容器日志记录。

2-6 是 8.5.x / 9.0.x 中连接器重构的副作用。 它们都是低级的内部 API,我有点惊讶 发现引导正在使用。

7 是用于将 web.xml 传递给 Jasper 的机制的一部分 加工。它已被删除,因为从 Servlet 开始不再需要它 3.0,因为所有必要的信息都可以通过标准的 Servlet API 获得。

8 那是一些 API 清理工作。那一个可以很容易地恢复 对于 8.5.x。

提交时间为 2014 年 11 月。

从 Tomcat 8.0 开始,该类仍然存在 - 并且 在 *deprecated” 列表中:

https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/tomcat/util/net/jsse/JSSESocketFactory.html

这是讨论“删除 BIO”(“阻塞 I/O”)的更新日志:

Migrating from Tomcat 8.0 to 8.5

最后,比较这两个链接可能会有所帮助:

SSL/TLS Configuration HOW-TO Tomcat 8.0.39

SSL/TLS Configuration HOW-TO Tomcat 8.5.9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2017-09-02
    • 2020-06-23
    相关资源
    最近更新 更多