【发布时间】: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:您必须编写自己的自定义信任管理器
标签: java security authentication tomcat ssl