从Java7更新45开始,如果不触发警告,就不能再查找清单信息了?
不幸的是,如果您的应用程序需要访问其加载的签名jar清单,那么Oracle和其他人在这里()为解决7 update 45问题提供的解决方案就不起作用。在我的例子中,我们的应用程序这样做是为了记录相关的清单信息 在我的web start应用程序中,由于7u21需要添加“Trusted Library”属性,一切都运行良好。对于7u45,删除“Trusted Library”属性并添加其他解决方案中提到的所有其他属性将不起作用——我将得到与运行7u21时没有Trusted Library属性时相同的警告(说明应用程序同时包含已签名和未签名的代码): 我尝试了几乎所有可能的manifest/JNLP排列方式——没有什么能切中要害 我发现,基本上,当我们加载一个小程序的jar清单(不是JRE jar)并调用hasMoreElements时,会发生额外的安全检查,从而触发警告:从Java7更新45开始,如果不触发警告,就不能再查找清单信息了?,java,applet,manifest,java-web-start,security-warning,Java,Applet,Manifest,Java Web Start,Security Warning,不幸的是,如果您的应用程序需要访问其加载的签名jar清单,那么Oracle和其他人在这里()为解决7 update 45问题提供的解决方案就不起作用。在我的例子中,我们的应用程序这样做是为了记录相关的清单信息 在我的web start应用程序中,由于7u21需要添加“Trusted Library”属性,一切都运行良好。对于7u45,删除“Trusted Library”属性并添加其他解决方案中提到的所有其他属性将不起作用——我将得到与运行7u21时没有Trusted Library属性时相同的
public List<String> getManifests() {
...
Enumeration<URL> urls = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
while (urls.hasMoreElements()) {
.... a bunch of loop stuff
// at the end of the loop...
System.out.println("Checkpoint SGMLOOP8.");
System.out.println("Breaking....");
//break; <<<<<<---- if the next jar is one of our signed jars, the next line will trigger the warning. If instead we choose to break, the app works perfectly with no warning.
System.out.println("urls.hasMoreElements(): " + (urls.hasMoreElements() ? "true" : "false")); <<<<<<-------- will evaluate to false if user clicks Block on the warning, otherwise will evaluate to true when our signed jars are next
System.out.println("Checkpoint SGMLOOP9.");
}
...
}
问题是:当我们试图访问清单时,是否应该发出警告?目前,我们要么选择强制用户每次都看到警告,要么删除已签名jar清单信息的日志记录。这似乎是一个错误的选择,尤其是因为此清单信息对于调试问题非常有用,因为它确实是验证最终用户是否正在运行正确版本的应用程序的唯一方法(缺少现场直接物理检查)。我们的小程序尤其如此,因为JAR被允许缓存在客户端系统上(以及访问小程序的相应JavaScript),这意味着在升级/降级等之后,JAR很容易运行错误的JAR。如果日志中没有这些信息,将来可能会导致大麻烦
有什么想法吗?这尤其令人沮丧,因为Oracle无论如何都打算解决可信库问题,所以把所有这些调查工作都放在这上面可能只会浪费我的周末。Grrr
EDIT:我观察到,第一个遇到安全异常的jar实际上依赖于我应用程序中的另一个jar。我想,“也许应该首先读取依赖jar的清单?”所以我强制加载顺序,以便首先加载非依赖jar。最终结果?我可以看到非依赖jar现在首先抛出了安全异常。。。还有一个警告。我发现applet出现了这个问题,并且发现我自己的applet.jar文件(不是通过循环返回的前几次Java system.jar)中的hasMoreElements上出现了警告,并且只有在Java控制面板中启用了applet.jar文件缓存时才会出现警告
我不能让我的所有客户都禁用.jar文件缓存,但那些禁用的客户目前很高兴,因为混合代码警告并没有为他们出现。这不是一个答案,充其量只是一个解决办法。我发现小程序有这个问题,并且发现我自己的applet.jar文件(不是通过循环返回的前几次Java system.jar)中的hasMoreElements上出现了警告,而且只有在Java控制面板中启用了applet.jar文件缓存时才会出现警告
我不能让我的所有客户都禁用.jar文件缓存,但那些禁用的客户目前很高兴,因为混合代码警告并没有为他们出现。这不是一个答案,充其量只是一个解决办法。想更新这个问题,说的是,从Java 7 update 55开始,这个问题已经变得毫无意义,因为可以再次同时放入“可信库”和“调用方允许的代码库”清单属性。如果清单中有这两个属性,则不会触发警告 想更新这个问题,说从Java 7 update 55开始,这个问题已经变得毫无意义,因为可以再次同时放入“可信库”和“调用方允许的代码库”清单属性。如果清单中有这两个属性,则不会触发警告 您是否尝试将沙盒罐中的内容打包到签名罐中?我的意思是导出每个依赖类,将它们放在一个依赖类中,并对其进行签名?好吧,就是这样——我们的应用程序中不应该有任何沙盒jar。他们都签了名。控制台所说的沙盒jar实际上并不是,在启动过程的早期加载得很好。也就是说,我还没有试着把所有的东西都装进一个罐子里,所以这至少是一件值得尝试的事情。但无论如何,这都是不可取的,因为我们将无法再更新应用程序的各个组件。您是否尝试将沙盒jar的内容打包到签名jar中?我的意思是导出每个依赖类,将它们放在一个依赖类中,并对其进行签名?好吧,就是这样——我们的应用程序中不应该有任何沙盒jar。他们都签了名。控制台所说的沙盒jar实际上并不是,在启动过程的早期加载得很好。也就是说,我还没有试着把所有的东西都装进一个罐子里,所以这至少是一件值得尝试的事情。但无论如何,这都是不可取的,因为我们将无法再更新应用程序的各个组件。对,这正是我遇到的事情。我还没有尝试过禁用jar缓存;我得试试。所以,我试过禁用jar缓存。这会导致小程序完全失败。它会出现一个JARSignerException,指出它试图加载的第一个已签名的jar具有“未签名的条目”。这显然是错误的,因为当缓存打开时,一切正常。。。Java FTW。对,这和我遇到的完全一样。我还没有尝试过禁用jar缓存;我得试试。所以,我试过禁用ja
Checkpoint SGMLOOP8.
Breaking.... <<<<---- console output pauses here until user answers warning
security: resource name "META-INF/MANIFEST.MF" in http://<path_to_jar> : java.lang.SecurityException: trusted loader attempted to load sandboxed resource from http://<path_to_jar>
(message repeats for all our signed jars)
urls.hasMoreElements(): false <<<<---- false because user clicked blocked, otherwise true when user clicks don't block
Checkpoint SGMLOOP9.
// getResources is called in my code above
java.lang.ClassLoader
public Enumeration<URL> getResources(String name) throws IOException {
Enumeration[] tmp = new Enumeration[2];
if (parent != null) {
tmp[0] = parent.getResources(name);
} else {
tmp[0] = getBootstrapResources(name);
}
tmp[1] = findResources(name); <<<<------ This returns a new Enumeration<URL> object which has its own “hasMoreElments()” method overwritten – see below code
return new CompoundEnumeration<>(tmp);
}
java.net.URLClassLoader
public Enumeration<URL> findResources(final String name)
throws IOException
{
final Enumeration<URL> e = ucp.findResources(name, true);
return new Enumeration<URL>() {
private URL url = null;
private boolean next() {
if (url != null) {
return true;
}
do {
URL u = AccessController.doPrivileged( <<-- Security context could block this
new PrivilegedAction<URL>() {
public URL run() {
if (!e.hasMoreElements())
return null;
return e.nextElement();
}
}, acc);
if (u == null)
break;
url = ucp.checkURL(u); <<-- Security checks done in here
} while (url == null);
return url != null;
}
public URL nextElement() {
if (!next()) {
throw new NoSuchElementException();
}
URL u = url;
url = null;
return u;
}
public boolean hasMoreElements() {
return next();
}
};
}
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 24.45-b08 (Oracle Corporation)
Application-Name: AppName
Codebase: *
Permissions: all-permissions
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
Trusted-Only: false
Class-Path: jar1.jar jar2.jar jar3.jar
Specification-Title: AppName
Specification-Version: 1.0
Specification-Vendor: CompanyName
Implementation-Title: AppName
Implementation-Version: 1.0
Implementation-Vendor: CompanyName