配置 Apache Tomcat 7.0 以拒绝与过期客户端证书的连接

Configuring Apache Tomcat 7.0 to reject connections with expired client certificates

考虑将 Apache Tomcat 7.0 配置为执行客户端身份验证(将连接器的参数 clientAuth 设置为 true)。

看来,Tomcat 默认情况下信任过期的客户端证书,这些证书在其受信任的存储区中(允许它们成功进行身份验证)。

是否可以配置 Apache Tomcat 7.0 不信任并自动拒绝此类过期的客户端证书,即使它们在其受信任的存储区中?

看来,这可以通过设置另一个trustManagerClassName来实现,默认是X509TrustManagerImpl。但我不知道,默认算法真的允许过期证书吗?这里应该使用现有的哪一个?或者我必须自己实现并将其放入 tomcat 的库?

UPD:我发现了非常相似的问题:Java trustmanager behavior on expired certificates 但在答案中没有任何合适的解决方案。我正在寻找现有的更安全的 X509TrustManager 实现,它将检查证书是否过期。

我认为最好的办法是编写自己的 X509TrustManager 并使用自己的 checkClientTrusted 实现。不幸的是,您可能不得不编写大量管道代码,除非您可以找到另一个 class 来扩展以执行 heavy-lifting 管理信任库、撤销等

可能值得花时间使用调试器来 trace-through JRE 的 classes 以查看在默认 X509TrustManager 中发生了什么 -- 也许它配置不正确,或者它是Tomcat 可能无法启用某些对大多数人有意义的功能。

仅查看来自 Java 8 的反编译源,它看起来归结为 sun.security.validator.SimpleValidator,它似乎在检查证书的有效性时考虑了(当前)日期。我希望 JRE 本身在某个时候抛出 CertificateExpiredException。我认为 Tomcat 无法解决这些问题。

Another question on SO 对发生的事情有空想,但没有真正确定的。