gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:12 25 4
gpt4 key购买 nike

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

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 以检查是否过期?

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

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

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

Given the partial or complete certificate chain provided by the peer, build a certificate path to a trusted root and return if it can be validated and is trusted for server SSL authentication based on the authentication type.The authentication type is the key exchange algorithm portion of the cipher suites represented as a String, such as "RSA", "DHE_DSS". Note: for some exportable cipher suites, the key exchange algorithm is determined at run time during the handshake. For instance, for TLS_RSA_EXPORT_WITH_RC4_40_MD5, the authType should be RSA_EXPORT when an ephemeral RSA key is used for the key exchange, and RSA when the key from the server certificate is used. Checking is case-sensitive.

谢谢

最佳答案

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

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

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

关于过期证书上的 Java 信任管理器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com