我的java程序打包在一个jar文件中,并使用外部jar库,bouncy castle.我的代码编译得很好,但是运行jar会导致以下错误:
线程"main"中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效
我用谷歌搜索了一个多小时寻找解释,发现很少有价值.如果有人以前看过这个错误并且可以提供一些帮助,我将不得不承担责任.
对于那些谁得到了试图创建一个当这个错误尤伯杯罐子用maven-shade-plugin
,解决的办法是通过添加以下行插件配置排除清单签名文件:
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
对于那些使用gradle并尝试创建和使用fat jar的人,以下语法可能会有所帮助.
jar { doFirst { from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' }
您的一些依赖项可能是已签名的jar文件.当你将它们全部组合成一个大的jar文件时,相应的签名文件仍然存在,并且不再匹配"大组合"jar文件,因此运行时停止认为jar文件已经被篡改(它... ...说话).
您可以通过从jarfile依赖项中删除签名文件来解决此问题.不幸的是,蚂蚁不可能一步到位.
但是,我能够通过两个步骤使用Ant,而不是通过使用以下方式专门命名每个jarfile依赖项:
sleep元素应该可以防止将来修改日期的文件出错.
我在链接线程中找到的其他变体对我不起作用.
请使用以下命令
zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'
此处列出的解决方案可能提供指针.
Manifest主要属性的签名文件摘要无效
底线:
最好保留官方jar,只需将其作为依赖项添加到应用程序jar文件的清单文件中.
使用IntelliJ IDEA 14.01时出现此问题.
我能够解决它:
文件 - >项目结构 - >添加新(工件) - > jar->从模块窗口创建Jar的具有依赖性的模块:
选择你的主要课程
来自库的JAR文件选择复制到输出目录并通过清单链接
安全性已经是一个棘手的话题,但我很失望地看到最流行的解决方案是删除安全签名.JCE需要这些签名.Maven树荫爆炸了BouncyCastle jar文件,它将签名放入META-INF,但是BouncyCastle签名对于新的超级jar(仅适用于BC jar)无效,这就是导致此线程中出现无效签名错误的原因.
是的,排除或删除@ruhsuzbaykus建议的签名确实会使原始错误消失,但它也可能导致新的,神秘的错误:
java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available
通过明确指定在哪里找到算法,如下所示:
SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");
我能够得到一个不同的错误:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
JCE无法对提供程序进行身份验证,因为我们已 按照同一线程中的其他位置删除了加密签名.
我找到的解决方案是可执行的打包程序插件,它使用jar-in-jar方法在单个可执行jar中保留BouncyCastle签名.
另一种方法(正确的方法?)是使用Maven Jar签名者.这使您可以继续使用Maven阴影而不会出现安全错误.但是,您必须拥有代码签名证书(Oracle建议搜索"Java代码签名证书").POM配置如下所示:
org.apache.maven.plugins maven-shade-plugin 3.1.0 package shade org.bouncycastle:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA your.class.here true org.apache.maven.plugins maven-jarsigner-plugin 1.4 sign sign verify verify /path/to/myKeystore myfirstkey 111111 111111
不,没有办法让JCE识别自签名证书,因此如果您需要保留BouncyCastle证书,则必须使用jar-in-jar插件或获得JCE证书.
假设你使用ant构建jar文件,你可以指示ant省略META-INF目录.这是我的蚂蚁目标的简化版本:
在引用某处后,我遇到了同样的问题,它的工作方式如下所示:
org.apache.maven.plugins maven-shade-plugin 3.2.1 false package shade *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA