根据以下链接
https://github.com/spring-projects/spring-boot/issues/6164,tomcat 8.5 删除了以下功能
a) 类 org.apache.tomcat.util.net.ServerSocketFactory 不再存在
b) 类 org.apache.tomcat.util.net.jsse.JSSESocketFactory 不再存在
c) 方法 JSSEImplementaton.getServerSockerFactory(AbstractEndpoint) 不再存在
d) 方法 JSSEImplementaton.getSSLUtil(AbstractEndpoint) 不再存在
这些使我们从 tomcat 8.0 升级到 tomcat 8.5.x 变得困难。
我们有两个要求
这些如何在 tomcat 8.5 中实现?任何建议表示赞赏。(我们在 Tomcat 8 中使用自定义 SocketFcatory 实现了 tomcat 的接口)
连接器重构后JIoEndpoint
,允许指定任意的连接器ServerSocketFactory
不再可用。
但是,如果你允许对 Tomcat 的代码库进行一些更改,则 AJP 连接器几乎已准备好接受 SSL 连接:AbstractAjpProtocol
该类只是缺少addSslHostConfig
和findSslHostConfigs
或更好的实现,它不存储或返回任何带有非常明确注释的内容:
AJP 不支持 SSL
如果像 中那样更改它们AbstractHttp11Protocol
,你将能够像配置 HTTP/1.1 连接器一样配置 AJP 连接器:
<Connector SSLEnabled="true" port="8009" protocol="AJP/1.3">
<SSLHostConfig ...>
<Certificate ... />
</SSLHostConfig>
</Connector>
关于证书存储,你可以实现自己的KeyStoreSpi
安全提供程序并使用:
<Certificate certificateKeystoreProvider="your_provider"
certificateKeystoreType="your_type"
... />
谢谢你。我也联系了 tomcat 用户组。我得到的答案也是类似的方向
tomcat-users 组的回答没有你的那么详细。所以你的回答帮助了我。但是,我的最终要求是也从 AJP SSL 的自定义密钥库中读取证书。我们的 Keystore 已经实现了 java.security.KeyStoreSpi。但是,我不太清楚 tomcat 中的哪些类我应该重点使用它。你有什么指导方针吗?
您必须创建、测试和注册一个自定义安全性
Provider
(参见Oracle 的文档),它将仅提供您的自定义密钥库类型。完成后,您只需要certificateKeystoreType
在<Certificate>
元素中提供,Tomcat 就会使用它。