升级到tomcat 8.5时使用自定义密钥库和jsseimplementation

时间:2017-01-02 01:29:53

标签: java tomcat jsse

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

但是现在升级到8.5,我开始为JSSESocketFactory等获得很多ClassNotFoundException。
做了一点研究我发现他们已经删除了许多类和方法,如JSSESocketFactory.java,getServerSocketFactory(),getSSLUtil(AbstractEndpoint端点)等。

现在,我的问题是:
在apache tomcat 8.5中有什么方法我可以在server.xml中的“store”下配置我的自定义密钥库并使用我自己的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”中为“store”属性

设置“MYKS”

1 个答案:

答案 0 :(得分:4)

无论它的价值如何,这都是破坏它的提交:

Remove BIo specific JSSE code

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

  

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

     

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

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

答复:

  

1只需要通过log4j 1.x启用容器日志记录   log4j社区不再支持该版本。 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开始,该类仍然存在 - 并且*已弃用的 NOT "列表:

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