清除 Java 证书缓存(强制重新加载证书)

清除 Java 证书缓存(强制重新加载证书)

这是一个简单的问题。

当我尝试访问证书已过期的网站时,一个应用程序给出了此异常:java.security.cert.CertificateExpiredException

因此,我从网站机器更新了证书并重新启动了它。当我尝试从 Firefox 或 Chrome 访问它时,它将加载新证书(其到期日期设置在 2040 年左右)。

问题是,Java 应用程序似乎不会更新此证书,它似乎卡在某种内部缓存中。我已经尝试将其添加到keystore并在应用程序属性中设置选项,例如-Dcom.sun.net.ssl.checkRevocation=false。无论我做什么,它总是抛出一个java.security.cert.CertificateExpiredException

有任何想法吗?

答案1

默认的 Java 密钥库位置是您的主目录 (user.home 系统属性) 下的 .keystore 文件,因此,除非您另有指定,否则 Java 应用程序将在此处查找。

尝试运行:

$ keytool -list -keystore ~/.keystore -storepass changeit -v

查看其中是否有过期的证书。

如果您想指定使用不同的身份密钥库,那么您可以使用以下系统属性来实现:

javax.net.ssl.Keystore=/path/to/identity.jks
javax.net.ssl.keyStorePassword=mykeystorepassword

我相信 Firefox 使用 NSS,您可以使用 certutil 实用程序(来自 nss-tools 或类似的包)查看其密钥库 - 类似于:

$ certutil -L -d sql:$HOME/.pki/nssdb

您应该能够使用 pk12util 实用程序将密钥和证书提取到 PKCS12 文件中,但最好使用 keytool 实用程序生成新的证书签名请求。

请注意,撤销的证书与过期的证书不同,这就是 checkRevocation=false 不起作用的原因。即使证书尚未过期,CA 也可以随时撤销证书,这表明该证书不再受信任。

答案2

我在寻找强制 Java 识别新导入的证书的方法时遇到了这个问题。

对我来说,证书没有更新(在 Windows 上)的原因是因为已经有一个 Java 实例在运行(大概是使用旧的证书缓存)。

我只是终止了旧的 Java 进程,下次自动启动时(由于运行 Gradle 进程)证书就会更新。

相关内容