为什么JavaWebStart说一个已签名的jar文件是未签名的?

为什么JavaWebStart说一个已签名的jar文件是未签名的?,java,jar,code-signing,java-web-start,jar-signing,Java,Jar,Code Signing,Java Web Start,Jar Signing,Java Web Start(JWS)说它无法启动我的应用程序,因为jar文件未签名: Error: Unsigned application requesting unrestricted access to system Unsigned resource: .../dynaccn.jar 但是jar文件已签名: $ jarsigner -keystore ... dynaccn.jar idv $ jar tf dynaccn.jar META-INF/MANIFEST.M

Java Web Start(JWS)说它无法启动我的应用程序,因为jar文件未签名:

Error: Unsigned application requesting unrestricted access to system
       Unsigned resource: .../dynaccn.jar
但是jar文件已签名:

$ jarsigner -keystore ... dynaccn.jar idv
$ jar tf dynaccn.jar
META-INF/MANIFEST.MF
META-INF/IDV.SF
META-INF/IDV.RSA
META-INF/
edu/
edu/ucar/
edu/ucar/unidata/
edu/ucar/unidata/dynaccn/
App$1.class
...
$ jarsigner -verbose -certs -verify dynaccn.jar
       28325 Tue Aug 17 09:41:58 MDT 2010 META-INF/MANIFEST.MF
       28404 Tue Aug 17 09:41:58 MDT 2010 META-INF/IDV.SF
        2880 Tue Aug 17 09:41:58 MDT 2010 META-INF/IDV.RSA
           0 Tue Aug 17 09:41:58 MDT 2010 META-INF/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/unidata/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/unidata/dynaccn/
...
sm       486 Mon Aug 16 10:10:34 MDT 2010 App$1.class

      X.509, CN=University Corporation for Atmospheric Research, OU=UNIDATA, O=University Corporation for Atmospheric Research, L=Boulder, ST=Colorado, C=US
      [certificate will expire on 2/6/11 4:59 PM]
      X.509, CN=Thawte Code Signing CA, O=Thawte Consulting (Pty) Ltd., C=ZA
      [certificate is valid from 8/5/03 6:00 PM to 8/5/13 5:59 PM]
      [KeyUsage extension does not support code signing]
      X.509, EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
      [certificate is valid from 7/31/96 6:00 PM to 12/31/20 4:59 PM]
      [CertPath not validated: null]
...
jar verified.

Warning: 
This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.
This jar contains entries whose signer certificate will expire within six months. 
This jar contains entries whose certificate chain is not validated.
This jar contains signed entries that's not signed by alias in this keystore.
JWS和我的浏览器都有“Thawte Premium Server CA”证书


即使JWS缓存和浏览器下载区域为空,也会出现问题

我不相信“KeyUsage”消息是相关的,因为1)相同的证书链用于另一个成功启动的应用程序;2)我读过的文档表明,Thawte代码签名CA仅用于验证UNIDATA证书,而不是对代码进行签名

我的环境是Linux 2.6.27.41-170.2.117.fc10.x86_64、Firefox 3.6.8(i686)和Java 1.7.0-ea

为什么这个应用程序不能启动

更新:我发现,如果JNLP文件中的“codebase”属性引用本地目录,而不是引用用户身份验证背后的URL,则应用程序将启动。在后一种情况下,如果从命令行调用,javaws(1)将身份验证网页解释为JNLP文件(具有明显的结果)。如果“deployJava”脚本从用户身份验证网页调用(以便浏览器具有会话cookie),则javaws(1)表示应用程序未签名。我发现这两种故障模式都很奇怪,因为javaws(1)文档说它理解用户对网页的身份验证,并且jar文件是经过签名的

  • 确保您没有使用jar的缓存(未签名)版本。清理临时文件夹,其中
  • 确保jar中需要特殊权限的所有依赖项(jar)都已签名

  • 确保在小程序中使用doPrivileged块包装调用。我不确定它为什么会这样工作,但似乎很有魅力。

    我在Gentoo Linux上运行OpenJDK 7,我想我也遇到了同样的问题

    我无法让它与OpenJDK 7一起工作。只有使用Sun Java 6 JDK版本重新签名才能最终正确地签名应用程序。(我也重新构建了它,因为它是由ant管理的,不过我不知道这是否有必要)


    仅仅切换到正式的JDK 6而不重建只会使“jarsigner-verify-verbose-certs”变为“CertPath not validated:null”时的“[CertPath not validated:null]”警告消失,但在我最终使用的应用程序中似乎不起作用。

    即使JWS缓存为空,问题也会发生。只有一个jar文件,它只包含类。您如何对jar文件进行签名?我在ant中使用signjar任务时遇到过这些问题,其中lazy属性设置为true。删除
    lazy=true
    属性基本上解决了问题。@Pram我使用这个ant(1)条目:。未使用“lazy”属性。该应用程序是独立的:它不是小程序。