2017-01-02 25 views
3

我們使用我們自己的自定義密鑰倉庫,並使用JSSEImplementation和ServerSocketFactory提供了自定義類實現,並在server.xml中爲「store」和「sslImplementation」屬性配置了這兩個自定義類實現。升級到tomcat 8.5時使用自定義密鑰倉庫和jsseimplementation

但現在升級到8.5,我開始大量的ClassNotFoundException爲JSSESocketFactory等
做一點研究,我發現,他們已經拆了很多的類和方法,如JSSESocketFactory.java,getServerSocketFactory(),getSSLUtil(AbstractEndpoint端點)等

所以,現在,我的問題是:
是那裏的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); 
     } 
    } 
} 

「MYKS」在server.xml中設置「存儲」屬性

+0

你好:我相信答案是 「是」,而解決方案是定義使用JSSE自己的自定義(VS 。顯然現在已經過時的Tomcat API)。我只能找到一篇關於如何做到這一點的文章:http://www.angelfire.com/or/abhilash/site/articles/jsse-km/customKeyManager.html – paulsm4

+0

我很好奇.. 。爲什麼你需要自己的'SocketFactory'? –

回答

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構件org.apache.tomcat .embed:Tomcat的嵌入-測井巨力不再存在
  2. 類org.apache.tomcat.util.net.ServerSocketFactory不再存在
  3. 類org.apache.tomcat.util.net.jsse.JS SESocketFactory不再存在
  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的社區不再支持。 log4j 2.x可以將 用於沒有任何額外庫的容器日誌記錄。

2-6是8.5.x/9.0.x中連接器重構的副作用。 他們都是低級的內部API,我有點驚訝 找到開機正在使用。

7是用於將web.xml傳遞給Jasper以處理 的機制的一部分。由於所有必要的信息都可以通過標準的Servlet API獲得,因此它已被刪除,因爲從Servlet 3.0開始不再需要它。

8這是一些API清理。對於8.5.x,這個可以很容易地恢復爲 。

提交於十一月提出,2014年

比如Tomcat 8.0,下課了還在那裏 - 和的*不贊成」名單:

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

Finallly,比較這兩個環節可能會有所幫助:

SSL/TLS Configuration HOW-TO Tomcat 8.0.39

SSL/TLS Configuration HOW-TO Tomcat 8.5.9