我已经在网上搜索并尝试了很多东西而且没有任何作用。首先,我不是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人,只是继承了这个应用程序。
答案 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;
}
});