我们使用自己的自定义密钥库,并使用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”答案 0 :(得分:4)
无论它的价值如何,这都是破坏它的提交:
以下是删除它的一些理由:
https://github.com/spring-projects/spring-boot/issues/6164
@ markt-asf 8.5.3中似乎有许多重大变化 (从8.0.33升级):
- Maven artifact org.apache.tomcat.embed:tomcat-embed-logging-juli不再存在
- 类org.apache.tomcat.util.net.ServerSocketFactory不再存在
- 类org.apache.tomcat.util.net.jsse.JSSESocketFactory不再存在
- 方法JSSEImplementaton.getServerSockerFactory(AbstractEndpoint)不再存在
- 方法JSSEImplementaton.getSSLUtil(AbstractEndpoint)不再存在
- Http11NioProtocol.getEndpoint()不再可见
- 字段org.apache.tomcat.util.scan.Constants.MERGED_WEB_XML不再存在
- AbstractHttp11Protocol.setCompressableMimeTypes不再存在
醇>
答复:
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
最后,比较这两个链接可能会有所帮助: