2015-11-13 27 views
2

考虑Apache Tomcat 7.0配置为执行客户端认证(连接器的参数clientAuth设置为true)。配置Apache Tomcat 7.0以拒绝具有过期客户端证书的连接

看起来,Tomcat信任默认过期的客户端证书,它位于其可信存储区(允许它们成功进行验证)。

是否可以配置Apache Tomcat 7.0不信任并自动拒绝这些过期的客户端证书,即使它们位于其可信存储中?

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

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

+0

只是为了确认:您有一个包含过期证书的信任库,并且Tomcat在客户提交证书时仍继续信任该证书?自上次启动Tomcat以来,证书是否过期?您是否能够从信托商店中删除证书以撤消它? –

+0

@ChristopherSchultz 1)是的,2)Tomcat可以在任何时候重新启动,没关系,3)不,我无法从信任存储中删除它。 – Andremoniy

+0

您是否尝试过使用'crlFile'来指定证书撤销列表?我意识到X.509应该可以尊重证书的到期日期,但如果这不符合预期,这是一个选项。 –

回答

0

我认为你最好的选择是编写你自己的X509TrustManager并使用你自己的checkClientTrusted实现。不幸的是,您可能需要编写大量的管道代码,除非您可以找到另一个类来扩展以管理信任库,撤销等等。

这可能是值得您花时间使用调试器追踪JRE的类以查看默认的X509TrustManager中发生了什么 - 可能是配置不正确,或者可能Tomcat没有启用某些对大多数人有意义的功能。

只看Java 8的反编译源代码,看起来好像是sun.security.validator.SimpleValidator,它在检查证书有效性时似乎考虑了(当前)日期。我预计JRE本身会在某些时候抛出CertificateExpiredException。我不认为Tomcat管理这些。

Another question on SO对于会发生什么事情有些闲置的猜测,但没有什么确切的。