签署的Java代码在7.0 21更新后不作为签名

时间:2013-04-27 20:30:17

标签: java security code-signing

我已经在网上搜索并尝试了很多东西而且没有任何作用。首先,我不是Java大师,但我已经在这里完成了我的作业,所有看起来都是正确签名并应该正常工作。该应用程序是由其他人开发的,但我们有代码,它在最新的Java版本之前工作正常。现在它抛出一个错误,使其无法签名。我们有一个GoDaddy证书,我们用它来使用build.xml中的signjar对代码进行签名(我们使用的是Netbeans)。 有两个项目。一个访问串行端口与Scale(RXTXMyComm)进行通信,另一个访问进行数据计算等(CWML)。 RXTXSerial Dll也包含在名为rxtxSerial.native.jar的jar中。

首先,我们使用以下build.xml编译和构建RXTX项目(parital以显示它是如何签名的): `

<project name="RXTXCommMY" default="default" basedir=".">
    <description>Builds, tests, and runs the project RXTXCommMY.</description>
    <import file="nbproject/build-impl.xml"/>

    <target name="-post-jar">
        <jar destfile="dist/rxtxSerial.native.jar">
            <fileset dir="lib/win32" includes="rxtxSerial.32.dll" />
            <fileset dir="lib/win64" includes="rxtxSerial.64.dll" />
        </jar>
        <signjar jar="dist/rxtxSerial.native.jar" storetype="pkcs12" storepass="MYPASS" alias="cwml's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/rxtxSerial.native.signed.jar" />
        <delete file="dist/rxtxSerial.native.jar" />

        <signjar jar="${dist.jar}" storetype="pkcs12" storepass="MYPASS" alias="cwml's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/RXTXCommMY.signed.jar" />
        <delete file="${dist.jar}" />
    </target>
</project>

`

然后将这些jar包含在CWML项目中,并按如下方式构建: `

<target name="-post-jar">
        <tstamp>
            <format property="build.timestamp" pattern="yyyyMd_HmsS" />
        </tstamp>

        <filter token="build.timestamp" value="${build.timestamp}" />

        <basename property="jarFilename" file="${dist.jar}" suffix=".jar" />
        <signjar jar="${dist.jar}" storetype="pkcs12" storepass="MYPASS" alias="CWML's godaddy.com, inc. id" keystore="../CERTNAME.p12" signedjar="dist/${jarFilename}_v${build.timestamp}.jar" />
        <delete file="${dist.jar}" />

        <copy file="index.html" todir="dist" filtering="true" />
        <copy file="cwml.jnlp" todir="dist" filtering="true" />
    </target>

`

jnlp如下所示: `

<?xml version="1.0" encoding="UTF-8"?>
<jnlp>
    <information>
        <title>Scale Applet</title>
        <vendor>Scale Applet</vendor>
    </information>

    <security>
        <all-permissions />
    </security>

    <resources>
        <j2se version="1.7+" />
        <jar href="CWML_v2013427_153155832.jar" main="true" />
        <jar href="lib/RXTXCommMY.signed.jar?v=2013427_153155832" />
        <nativelib href="lib/rxtxSerial.native.signed.jar?v=2013427_153155832" />
    </resources>

    <applet-desc name="ScaleApplet" main-class="cwml.ScaleApplet" width="200" height="40">
    </applet-desc>
</jnlp>

`

我确实通过Janela验证器运行它,它很好。

它在Netbeans中运行和工作,它在更新21之前工作正常。我还发现如果我从jnlp中删除它在IE中使用Java 7.0的标签,但它在Chrome中不起作用。当我在Chrome中运行Java控制台时,我得到以下内容:

`

java.lang.ExceptionInInitializerError thrown while loading gnu.io.RXTXCommDriver
Exception in thread "Thread-15" java.lang.ExceptionInInitializerError
    at cmwl.ioport.PortHelper.getAvailablePorts(PortHelper.java:49)
    at cmwl.ioport.PortHelper.connectSerialPorts(PortHelper.java:64)
    at cmwl.ioport.PortHelper.run(PortHelper.java:42)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "sun.arch.data.model" "read")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
    at java.lang.System.getProperty(Unknown Source)
    at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:123)
    ... 3 more

` 我运行了一个更详细的跟踪,它显示了Certs正在验证所有三个罐子。我不知所措,因为这给我们带来了很大的问题。正在调用的第123行是:

System.loadLibrary( "rxtxSerial." + System.getProperty("sun.arch.data.model") );

任何帮助都将非常感谢。正如我所说,我根本不是Java人,只是继承了这个应用程序。

2 个答案:

答案 0 :(得分:0)

根据oracle关于7.0.21更新:

  

问:为了签署我的代码,我需要做些什么?

     

答:您需要将所有特定于应用程序的代码打包到Jar中   文件,然后获取标识您的代码签名证书   组织。大多数组织应该已经拥有此类证书   如果你不这样做,预计一年可以支付大约100美元   来自认证机构的此类证书。现在使用Java JDK   jarsigner实用程序来签署您的Jar文件。整个过程是   由Java记录,与JIS产品本身无关。

答案 1 :(得分:0)

你的问题看起来像我最近遇到的问题。似乎原因在于本机库加载过程。尝试重写这样的初始化代码:

AccessController.doPrivileged(new PrivilegedAction() {
  public Object run() {
    System.loadLibrary(...);
    System.loadLibrary(...);
    return null;
  }
});