Java 信任管理器对过期证书的行为

Posted

技术标签:

【中文标题】Java 信任管理器对过期证书的行为【英文标题】:Java trustmanager behavior on expired certificates 【发布时间】:2011-07-09 13:49:49 【问题描述】:

如果证书已过期,java 的 TrustManager 实现是否会忽略? 我尝试了以下方法: - 使用 keytool 和参数 -startdate "1970/01/01 00:00:00" 我创建了一个带有过期证书的 P12 密钥库。 - 我导出了证书:

Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 1 entry

Alias name: fake
Creation date: 5 ╠ά± 2011
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
Serial number: -1c20
Valid from: Thu Jan 01 00:00:00 EET 1970 until: Fri Jan 02 00:00:00 EET 1970
Certificate fingerprints:
         MD5:  A9:BE:3A:3D:45:24:1B:4F:3C:9B:2E:02:E3:57:86:11
         SHA1: 21:9D:E1:04:09:CF:10:58:73:C4:62:3C:46:4C:76:A3:81:56:88:4D
         Signature algorithm name: SHA1withRSA
         Version: 3


*******************************************

我将此证书用作 Tomcat 的服务器证书。 然后使用 apache httpClient 我连接到 tomcat,但首先我将过期的证书添加到客户端的信任库(使用 TrustManager

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

并加载过期的证书)。 我期待连接失败。 相反,连接成功。 使用System.setProperty("javax.net.debug", "ssl"); 我明白了:

***
Found trusted certificate:
[
[
  Version: V3
  Subject: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
  modulus: 10350555024148635338735220482157687267055139906998169922552357357346372886164908067983097037540922519808845662295379579697361784480052371935565129553860304254832565723373586277732296157572040989796830623403187557540749531267846797324326299709274902019299
  public exponent: 65537
  Validity: [From: Thu Jan 01 00:00:00 EET 1970,
               To: Fri Jan 02 00:00:00 EET 1970]
  Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
  SerialNumber: [   -1c20]

]

我看到在 TLS 握手中过期的证书是由 Tomcat 连接器发送的。 但客户端(即 TrustManager)不会拒绝连接。 这是默认行为吗? 我想以某种方式配置信任管理器来检查过期吗?

更新: 我发现实际使用的 TrustManager 是 X509TrustManagerImpl。这里X509TrustManagerImpl 说这个类有一个最小的逻辑。可能是我使用了错误的 TrustManager?

更新 2: 从 javadoc X509TrustManager 不清楚它是否检查证书过期

void checkServerTrusted(X509Certificate[] chain,String authType)
                                throws CertificateException  

鉴于部分或完整 证书链由 对等体,建立一个证书路径到 受信任的根并返回(如果可以) 经过验证并受服务器信任 基于 SSL 的身份验证 身份验证类型。身份验证 type 是密钥交换算法 密码套件的一部分 表示为字符串,例如 “RSA”、“DHE_DSS”。注意:对于一些 可导出的密码套件,密钥 交换算法确定在 握手期间的运行时间。为了 例如,对于 TLS_RSA_EXPORT_WITH_RC4_40_MD5, authType 应该是 RSA_EXPORT 当 临时 RSA 密钥用于密钥 交换和 RSA 当密钥来自 使用服务器证书。 检查区分大小写。

谢谢

【问题讨论】:

你有没有找到解决办法,如何强制Tomact检查证书过期?任何现有的其他X509TrustManager 实现可以做到吗? @Andremoniy:您必须编写自己的自定义信任管理器 【参考方案1】:

我自己在覆盖 checkServerTrusted 时遇到了类似的问题。

事实证明,如果您需要检查过期时间,您可以调用 X509Certificate.checkValidity(),它会抛出 CertificateExpiredException 或 CertificateNotYetValidException。这两个都扩展了 CertificateException,因此它们可以被checkServerTrusted 愉快地抛出。

为了解决您的问题,您可以实现一个新的 X509TrustManager,它在其构造函数中创建您的原始实例,将所有方法实现为对原始实例的调用,并为 certs[] 内 @987654327 中的每个证书添加对 checkValidity 的调用@。

【讨论】:

【参考方案2】:

我相信 IBM 的 JSSE 会检查是否过期,而 Sun 的则不会。

【讨论】:

你认为这是一个错误,还是他们在 SUN 中这样设计它?在我看来,这种行为至少是违反直觉的。 这似乎是故意的。我认为这样做的目的是,如果您认为这很重要,您可以在握手侦听器中检查自己是否过期。【参考方案3】:

我没有尝试您的示例,但我现在必须定期重新生成我的服务器证书(用于我们的开发服务器),因为它们的证书的有效期很短。

在我们的例子中,客户端本身在信任库中没有服务器证书,只有我们 CA 的证书(有效期更长),当客户端尝试连接到服务器时,双方都会收到 SSLException(其中在您的情况下可能包含在另一个异常中)。

我猜信任管理器会假设“如果你给我过期的证书来信任,我会这样做”。 请尝试我们的方法(它还可以让您在每次服务器证书过期时更新客户端)。

【讨论】:

@Paulo:1) 您只存储 CA 的证书。因此,如果客户端收到过期的证书(由您的 CA 签名),信任管理器会拒绝它吗? 2)您的建议是公平的,但是从我的角度来看,如果这是信任管理器的默认行为,那至少很奇怪。如果证书在 10 小时前过期怎么办?信任管理器会接受它为受信任的,因为它已经在信任库中了?我认为这不是正确的行为 1) 是的,这是我的观察。对于 2),我不确定这是预期行为还是错误,这只是猜测如何解释您和我的观察结果。 @Paulo:我发现实际使用的 TrustManager 是X509TrustManagerImpl。这里java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/… 说这个类有一个最小的逻辑。可能是我使用了错误的 TrustManager? PKIXValidator 然后查看证书链中是否出现了受信任的证书,如果是,它只获取之前的证书并将它们提供给 CertPathValidator 进行检查,然后委托给 CertPathValidatorSpi 实现,该实现进行实际的加密检查(我希望如此)。但似乎在此过程中从未完成对根受信任证书到期的检查。 看起来这个检查应该在 PKIXValidator 构造函数中,从trustedCerts 集合中丢弃过期的根证书。

以上是关于Java 信任管理器对过期证书的行为的主要内容,如果未能解决你的问题,请参考以下文章

电脑显示网站证书过期怎么办?

vmware证书过期?

ADFS及ADFS Proxy证书过期处理

SSL证书过期了怎么办

Java下载https文件上传到阿里云oss服务

信任过期的证书[重复]