【问题标题】:How do I fix "missing Codebase, Permissions, and Application-Name manifest attribute" in my JNLP app?如何在我的 JNLP 应用程序中修复“缺少代码库、权限和应用程序名称清单属性”?
【发布时间】:2013-10-29 13:08:31
【问题描述】:

随着最近的 Java 更新,许多人在他们的 Java Web Start 应用程序缺少 CodebasePermissionsApplication-name 清单属性时遇到问题。尽管有资源可以帮助您完成此任务,但我找不到任何全面此问题的答案,所以我觉得问答会很好。那么问题来了:

我的 Java Web Start 应用在控制台中显示以下警告:

Missing Permissions manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar
Missing Codebase manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar
Missing Application-Name manifest attribute for: http://www.codebase.com/myApp/dist/myApp.jar

我该如何解决这个问题?

【问题讨论】:

    标签: java java-web-start jnlp


    【解决方案1】:

    (1) 首先,您需要创建一个包含您要添加的所有属性的文本文件。我的文本文件如下所示:

    Permissions: all-permissions
    Codebase: http://www.codebase.com/myApp/dist
    Application-Name: My Application
    

    我将其命名为addToManifest.txt。显然,您需要更改参数以满足应用程序的需求。

    (2) 接下来,您需要将它添加到主 .jar 和所有库中。执行此操作的命令是:

    jar ufm dist\myApp.jar addToManifest.txt
    

    当然,dist\myApp.jar 需要指向您的主要 .jar 文件。您还需要对所有库执行此操作。

    jar ufm dist\lib\jcommon-1.0.16.jar addToManifest.txt
    jar ufm dist\lib\jfreechart-1.0.13.jar addToManifest.txt
    jar ufm dist\lib\joda-time-2.2.jar addToManifest.txt
    ...
    

    (注意:在 Windows 上,我为此写了一个 .bat 文件。)

    完成此操作后,应将属性写入.jars。您可以在 zip 管理器(如 7-Zip)中打开 .jar,解压缩 MANIFEST.MF 文件,在文本编辑器中打开它,您应该会看到列出的属性。

    (3) 添加属性后,您需要退出应用。执行此操作的命令是:

    jarsigner dist\myApp.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
    

    您还需要为所有库执行此操作:

    jarsigner dist\lib\jcommon-1.0.16.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
    jarsigner dist\lib\jfreechart-1.0.13.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
    jarsigner dist\lib\joda-time-2.2.jar -keystore "C:\myApp\KEYSTORE.ks" alias -storepass password
    

    之后,应添加您的属性并签名您的.jars!

    注意:您只需签署/部署您的库一次,除非您更改库结构。即,如果您正在更新您的应用,但库已经更改、正确签名和部署了它们的清单,则除非您从应用中添加/删除库,否则您无需重新签名/部署库。

    注意 #2:当前版本的 Netbeans 会将 CodebasePermissions 清单属性添加到您的仅主 .jar,但不会添加到您的库中。如果您使用 Netbeans,当您尝试添加重复的清单属性时,您将收到来自 jar 实用程序的警告。队列中有一个错误报告以修复此问题https://netbeans.org/bugzilla/show_bug.cgi?id=234231

    编辑:最新版本的 Netbeans (8.0) 现在为您将所有三个(CodebasePermissionsApplication-Name)添加到清单中。

    【讨论】:

    • "注意:如果 Codebase 属性未指定安全服务器,例如 HTTPS,则存在一些风险,即您的代码可能会被用于中间人 (MITM) 攻击方案。”另请参阅 JAR File Manifest Attributes for Security,引用 here
    • 您能否建议如何处理代码库未知的情况,即我需要在清单中有 Codebase: *,因为应用程序部署在许多地方。有什么办法可以避免警告吗?谢谢。
    • @Amos,没有。那绝对不会更简单。 特别是如果您每次发布更新时都需要重新打包/重新签名您的 .jar。
    • 这在 netbeans 8 中修复了吗?如果解决了这个很好的答案,那就太好了:D
    • @johnny,这是在包含部署到服务器的应用程序的 .jar 文件上完成的。该程序通过.jnlp 文件启动,该文件下载到客户端并执行。
    【解决方案2】:

    如果您使用 Netbeans,请在文件 nbproject/project.properties 中设置这些属性:

    • manifest.custom.codebase
    • manifest.custom.permissions
    • manifest.application.name.attribute

    最后一个仅受 Netbeans >= 8.0 支持(请参阅here)。其他的甚至可以在 Netbeans 7.2 中工作。我也将 jnlp.mixed.code 设置为trusted_only,但可能不适合您的情况。如果您无法切换到较新版本的 Netbeans,您可以自行承担修改文件 jnlp-impl.xml 的风险。

    如果你不使用 Netbeans,atulsm 的建议会更好。

    【讨论】:

      【解决方案3】:

      另一种方法是在构建脚本本身中处理它。

      第 1 步:定义要更新的目标

      <target name="updateManifest">
          <manifest file="${file}" mode="update">         
              <attribute name="Trusted-Only" value="true"/>
              <attribute name="Permissions" value="all-permissions"/>
              <attribute name="Codebase" value="*"/>          
          </manifest>
      </target> 
      

      第 2 步:调用更新目标并使用 jar 中的新清单

          <ant target="updateManifest">
              <property name="file" location="manifest.use" />
          </ant>
      
          <jar jarfile="${jar_name}.jar" manifest="manifest.use">
              <fileset dir="${dest}">
                  <include name="File1" />                
              </fileset>
          </jar>
      

      【讨论】:

      【解决方案4】:

      manifest 添加到jar 和签名jar 的示例..

      <target name="-post-compile">
              <jar destfile="${build.web.dir}/jars/app.jar" >
                  <fileset dir="${build.classes.dir}">
                      <include name="com/sample/test/client/**/*.*"/>
                      <include name="com/sample/test/share/**/*.*"/>
                  </fileset>
                  <manifest>
                      <attribute name="Author" value="${user.name}"/>
                      <attribute name="Permissions" value="all-permissions"/>
                      <attribute name="Codebase" value="http://localhost:8080/app/"/>
                      <attribute name="Application-Name" value="App"/>
                  </manifest>
              </jar>
              <signjar keystore="app.keystore"  storepass="test"  jar="${build.web.dir}/jars/app.jar" alias="tomcat" />
      
      
              <copyfiles files="${file.reference.javadatepicker.jar}" todir="${build.web.dir}/jars"/>
      
      
              <delete dir="${build.web.dir}/WEB-INF/classes/com/sample/app/client"/>
              <!--keytool -genkey -alias tomcat -keystore app.keystore -keypass test -storepass test -validity 1960-->
              <signjar keystore="app.keystore"  storepass="test"  jar="${build.web.dir}/jars/javadatepicker.jar" alias="tomcat" />
      
          </target>
      

      【讨论】:

        【解决方案5】:

        如果错误消息如下所示:

        Missing Application-Name manifest attribute for: server root/filename.jar
        

        你可以这样解决:

        1. 开始control panel

        2. 选择Java Control Panel

        3. 选择Security标签

        4. Exception Site list点击Edit Site List按钮

        5. 单击Add 按钮。

        6. 输入服务器根目录(例如:https://ibank.cib.hu),然后按OK

        7. 重新启动浏览器/应用程序。

        Resource here.

        【讨论】:

        • 这并不是真正的解决方案。这只是一种忽略问题的方法,而不是解决它。关闭计算机是另一种忽略问题而不解决问题的方法。
        • @ryvantage 此答案适用于最终用户。
        • 我认为这是一个很好的解决方案,通常您不希望所有网站都被信任。
        • @2astalavista,明白了。唯一的问题是,Missing Application-Name 消息是只出现在控制台中的警告,而不是向用户显示的错误,除非他们足够聪明地显示控制台。此外:我们应该不愿意建议一种解决方法,以便最终用户可以仅仅因为他们认为这是一种滋扰而摆脱安全警告,即使他们无力彻底解决问题。我不知道 Oracle 希望这个警告是什么,但它的存在是有原因的。
        • @ryvantage 如果它只出现在控制台中,我不会卷入这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 2011-01-11
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多