我正在开发一个 Java 产品,它使用 sun.security.validator.Validator 的 validate() 方法来验证对等方的 TLS 证书链。有些同行的证书已过期。如果用户选择,产品必须忽略过期错误。我可以捕获 CertificateExpiredException 并忽略它。但我不确定这是否是 validate() 方法中的最后一次检查,以及在遇到过期证书之前是否通过了其他检查。以这种方式忽略证书过期是否安全?有更好的方法来实现吗?
验证只有两个结果:有效或无效。因此,有效但已过期不是验证者期望的结果。
因此
sun.security.validator.Validator
可能不是您想要使用的类,特别是如果您必须依赖它的实现细节。这可能会导致 Java 的未来版本出现问题。
您可以复制它的源代码(或者如果足够的话,可以复制
SimpleValidator
之一)并根据您的需要进行修改。
或者,当您检查源代码时,您会发现代码签名变体不会检查到期日期。但是,尽管使用 Validator
的变体很诱人,但要小心,它也可能会产生其他副作用!
也许更好的选择是提供 Validator
的
variants作为用户的选择,并具有所有含义。
来自
Validator
的 JavaDoc:
变体控制额外的扩展检查。目前支持五种变体:
- VAR_GENERIC(无需额外检查),
- VAR_TLS_CLIENT(TLS 客户端特定检查)
- VAR_TLS_SERVER(TLS 服务器特定检查),以及
- VAR_CODE_SIGNING(代码签名特定检查)。
- VAR_JCE_SIGNING(JCE 代码签名特定检查)。
- VAR_TSA_SERVER(TSA 服务器特定检查)。
- VAR_PLUGIN_CODE_SIGNING(插件/WebStart 代码签名特定检查)。
(注意数字五与列表实际长度的差异是部分来源)