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

Alb*_*dez 6 ssl certificate java cache

这里有一个简单的问题。

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

所以,我更新了网站机器的证书并重新启动了它。当我尝试从 Firefox 或 Chrome 访问它时,它会加载新证书(它的到期日期设置在 2040 年附近)。

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

有任何想法吗?

Kei*_*dis 1

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

尝试运行:

$ keytool -list -keystore ~/.keystore -storepass changeit -v
Run Code Online (Sandbox Code Playgroud)

查看里面是否有过期的证书。

如果您想指定使用不同的身份密钥库,则可以使用以下系统属性来执行此操作:

javax.net.ssl.Keystore=/path/to/identity.jks
javax.net.ssl.keyStorePassword=mykeystorepassword
Run Code Online (Sandbox Code Playgroud)

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

$ certutil -L -d sql:$HOME/.pki/nssdb
Run Code Online (Sandbox Code Playgroud)

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

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