我有一个 X509 证书 (java.security.cert.X509Certificate),我需要验证它。受信任的锚点已经在系统默认证书库( jre\lib\security\cacerts )中,但如果需要,我可以将其填充到其他内容中。该证书不是 SSL 证书。
我的第一个想法是使用 Java 的信任管理器,因为我已经在使用带有由同一 CA 颁发的服务器证书的 HTTPs。但似乎这只能用于 SSL 证书,因为它只提供 checkServerTrusted 和 checkClientTrusted。为了完整起见,这是我的尝试:
X509TrustManager x509TrustManager=null;
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
for (TrustManager trustManager : trustManagerFactory.getTrustManagers())
{
if (trustManager instanceof X509TrustManager)
{
x509TrustManager = (X509TrustManager)trustManager;
}
}
java.security.cert.X509Certificate x509 = .... get certificate ...
x509TrustManager.checkServerTrusted(new java.security.cert.X509Certificate[]{x509}, "RSA");
这可以满足我的所有需要,但它还会检查证书是否对 SSL 服务器(或客户端,如果我使用 checkClientTrusted)有效,并且显然失败了。
是否有任何简单的方法来指定信任管理器的证书和/或密钥用法,或者至少有一种方法来禁用检查(我可以自己做)。
将来我想使用 OCSP 或 CRL 列表来检查证书的实际状态。