证书过期时的Java trustmanager行为

如果证书已过期,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的服务器证书。

然后使用我连接到tomcat的apache httpClient,但首先我将过期的证书添加到客户端的信任库中(使用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吗?

从javadoc

X509TrustManager尚不清楚它是否检查证书到期

void checkServerTrusted(X509Certificate[] chain,String authType)

throws CertificateException

给定对等方提供的部分或完整证书链,请建立到可信根的证书路径,并根据身份验证类型返回可验证且对服务器SSL身份验证可信的证书路径。身份验证类型是LDAP的密钥交换算法部分以字符串形式表示的密码套件,例如“

RSA”,“

DHE_DSS”。注意:对于某些可导出的密码套件,密钥交换算法是在握手期间的运行时确定的。例如,对于TLS_RSA_EXPORT_WITH_RC4_40_MD5,当使用短暂的RSA密钥进行密钥交换时,authType应该为RSA_EXPORT;而使用服务器证书中的密钥时,authType应该为RSA。检查区分大小写。

谢谢

回答:

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

在我们的情况下,客户端本身在信任库中没有服务器证书,而只有我们的CA证书(具有更长的有效性),并且当客户端尝试连接到服务器时,双方都将收到SSLException(可以将其包装在您的情况下另一个例外)。

我猜想信任管理器会假设类似“如果您给我过期的证书以信任,我会做的”。尝试使用我们的方法(每次服务器证书过期时,它还可以节省您更新客户端的时间)。

以上是 证书过期时的Java trustmanager行为 的全部内容, 来源链接: utcz.com/qa/423567.html

回到顶部