【问题标题】:How to check if Java Web Start app will continue working after certificate expires如何检查证书过期后 Java Web Start 应用程序是否会继续工作
【发布时间】:2016-01-07 21:15:39
【问题描述】:

我们使用 CA (Thawte) 的代码签名证书对 Java Web Start 应用进行了签名。签名带有时间戳(我们将 -tca https://timestamp.geotrust.com/tsa 参数传递给 jarsigner 工具)以在证书过期后有效。目前,当证书有效时,该应用程序运行良好。但是当我们尝试更改本地时间以模拟证书到期时,应用程序将无法启动。我们得到以下异常:

java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Responder's certificate not within the validity period
at com.sun.deploy.security.RevocationChecker.checkOCSP(Unknown Source)
at com.sun.deploy.security.RevocationChecker.check(Unknown Source)
at com.sun.deploy.security.TrustDecider.checkRevocationStatus(Unknown Source)
at com.sun.deploy.security.TrustDecider.getValidationState(Unknown Source)
at com.sun.deploy.security.TrustDecider.validateChain(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGrantedInt(Unknown Source)
at com.sun.deploy.security.TrustDecider.isAllPermissionGranted(Unknown Source)
at com.sun.javaws.security.AppPolicy.grantUnrestrictedAccess(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
at com.sun.javaws.Launcher.prepareResources(Unknown Source)
at com.sun.javaws.Launcher.prepareAllResources(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.prepareToLaunch(Unknown Source)
at com.sun.javaws.Launcher.launch(Unknown Source)
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main.access$000(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.cert.CertPathValidatorException: Responder's certificate not within the validity period
at sun.security.provider.certpath.OCSPResponse.verify(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at sun.security.provider.certpath.OCSP.check(Unknown Source)
at com.sun.deploy.security.RevocationChecker$2.run(Unknown Source)
at com.sun.deploy.security.RevocationChecker$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.security.RevocationChecker.doPrivilegedOCSPCheck(Unknown Source)
... 20 more
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Thu Dec 17 00:59:59 CET 2015
at sun.security.x509.CertificateValidity.valid(Unknown Source)
at sun.security.x509.X509CertImpl.checkValidity(Unknown Source)
... 28 more

证书有效期为 09.10.2015 至 08.11.2017。

我们尝试使用 jarsigner 工具验证签名的 JAR。所有文件似乎都有时间戳:

      [entry was signed on 9.10.15 16:42]
  X.509, CN="GEOVAP, spol. s.r.o.", OU=Software, O="GEOVAP, spol. s.r.o.", L=Pardubice, ST=Czech Republic, C=CZ
  [certificate is valid from 9.10.15 2:00 to 8.11.17 0:59]
  X.509, CN=thawte SHA256 Code Signing CA, O="thawte, Inc.", C=US
  [certificate is valid from 10.12.13 1:00 to 10.12.23 0:59]

所以 jarsigner 的输出似乎是正确的。有人可以确认这真的意味着签名有时间戳吗?

我们注意到,如果我们只提前几 (3) 天更改当地时间,那么该应用程序就可以正常工作。但是如果我们改变它更多(周),那么我们就会得到例外。 CA 服务器是否检查客户端本地时间是否有效?如果确实如此,我们如何模拟证书到期?谢谢。

【问题讨论】:

    标签: java certificate code-signing trusted-timestamp


    【解决方案1】:

    原因和解决方法

    您的异常堆栈跟踪显示使用 OCSP(在线证书状态协议)的证书吊销检查失败,因为 OCSP 响应者的证书在您的测试日期到期(不是因为您的证书)。

    要执行测试,请尝试在 Java 控制面板中关闭证书吊销检查。

    还要确保您的证书尚未被永久接受(使用 Java 控制面板中的“恢复安全提示”)。

    关于时间戳签名的注意事项

    目前(在 j8u66 到 j8u144 之前)时间戳签名不能持久地防止签名过期。 Web Start 不会抱怨您的证书过期。但是,它会阻止您的申请并在您的 TSA 证书到期时声明“证书已过期或尚未生效”。即使在 keytool -printcert 输出的 Timestamp: 部分可见的 TSA 证书的到期日期之后,您也可以使用日期进行测试。

    根据您的应用程序类型,这可能是一个严重的问题。时间戳目前只为您提供更多时间,直到应用程序启动被阻止。我们在嵌入式环境中面临此问题,并已针对此问题提出 Oracle 支持请求。

    2016 年 1 月 7 日更新:Oracle 支持的最终回答是“没有错误。这种行为是预期的和故意的。肯定不会有任何变化。”。这意味着没有办法在没有到期的情况下签署申请。

    2017 年 11 月 6 日更新:尽管 Oracle 声明 2016 年签名仍然有效,即使在 TSA 的 Web Start j8u151 证书到期日期之后(使用 j8u144 和 j8u151 测试,j9 未测试)。这是出于故意还是错误,值得怀疑。

    【讨论】:

    • 看来Oracle可能已经修复了j8U151。至少我们遇到了这个问题,并且在 151 中无法重现。您能否分享该问题的链接?
    • @docDevil:引用来自我们在付费 Oracle 支持中的一个案例。这些案例不公开,因此我无法提供链接。不过,我还要测试一下 8u151 的行为。
    • @docDevil:我对 8u151 Web Start 的测试还表明,即使在我们和 TSA 的证书到期之后,签名仍然有效。 8u144 Web Start 阻止应用程序。
    【解决方案2】:

    JDK keytool 也可以用来检查时间戳:

    keytool -printcert -jarfile app.jar
    

    时间戳报告应如下所示:

        Timestamp:
    
    Owner: CN=GeoTrust 2048-bit Timestamping Signer 1, O=GeoTrust Inc, C=US
    Issuer: CN=Symantec Time Stamping Services CA - G2, O=Symantec Corporation, C=US
    Serial number: 5fd693fab098e3f4677bb8cb672c229e
    Valid from: Thu Jun 11 02:00:00 CEST 2015 until: Wed Dec 30 00:59:59 CET 2020
    Certificate fingerprints:
         MD5:  2B:51:8D:A4:11:F1:43:C7:84:62:5A:41:95:BB:5E:05
         SHA1: D7:1D:45:62:C6:33:36:7C:34:E3:66:CF:B7:6F:B9:7B:05:AF:34:B4
         SHA256: DC:DA:D2:91:F5:32:D5:BD:FC:E6:9D:06:41:A1:45:57:85:74:E0:D5:B9:8F:19:00:6C:19:AB:2E:9D:F9:96:42
         Signature algorithm name: SHA1withRSA
         Version: 3
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2011-06-12
      • 2011-01-05
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多