当前位置:  开发笔记 > 编程语言 > 正文

尝试运行.jar时"无效的签名文件"

如何解决《尝试运行.jar时"无效的签名文件"》经验,为你挑选了9个好方法。

我的java程序打包在一个jar文件中,并使用外部jar库,bouncy castle.我的代码编译得很好,但是运行jar会导致以下错误:

线程"main"中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效

我用谷歌搜索了一个多小时寻找解释,发现很少有价值.如果有人以前看过这个错误并且可以提供一些帮助,我将不得不承担责任.



1> ruhsuzbaykus..:

对于那些谁得到了试图创建一个当这个错误尤伯杯罐子用maven-shade-plugin,解决的办法是通过添加以下行插件配置排除清单签名文件:


    
        
            *:*
            
                META-INF/*.SF
                META-INF/*.DSA
                META-INF/*.RSA
            
        
    
    


我把这种方法用于我的超级罐,效果很好.http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html上有一个完整的POM示例,它显示了此方法筛选包含的文件.
这对我有用,但是...为什么我们必须忽略签名文件?我确定签名清单是有原因的....
我很想开始一个全新的线程 - 但由于这是Googles结果中的第一名 - 似乎很容易将它保留在这里.这里列出的行在我正在使用的POM文件中 - 我在运行应用程序时仍然遇到安全性错误.它建立得很好 - 当然没有做优步罐时运行正常 - 正如预期的那样.虽然这当然是一个选择 - 让它们分开 - 如果你想要一个Uber Jar,它并不能解决问题.
做完上面之后一定要做"mvn clean"!
@JerylCook签名文件用于指示此jar的内容包含这些文件.当你制作一个超级jar时,你会向jar中添加更多的文件,因此签名不正确.如果你真的想要,你可以重新签名新罐子,但当然这将是你的签名,而不是旧签名.或者,你不能分发超级jar,而是将签名的jar包含为一个单独的文件,但是那时首先会破坏超级jar的目的.

2> Keith P..:

对于那些使用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文件会在META-INF下添加这些文件,但是当它们被包含时,签名不再与jar内容一致.因此,删除它们可以避免签名不匹配.
这不适合我.我不得不将`exclude`放到我的`fatJar`任务中,该任务具有`configurations.compile.collect`命令.请参见http://stackoverflow.com/a/31426413/103412

3> Rich Apodaca..:

您的一些依赖项可能是已签名的jar文件.当你将它们全部组合成一个大的jar文件时,相应的签名文件仍然存在,并且不再匹配"大组合"jar文件,因此运行时停止认为jar文件已经被篡改(它... ...说话).

您可以通过从jarfile依赖项中删除签名文件来解决此问题.不幸的是,蚂蚁不可能一步到位.

但是,我能够通过两个步骤使用Ant,而不是通过使用以下方式专门命名每个jarfile依赖项:


    
        
            
        
    
    
    
        
        
            
        
    

sleep元素应该可以防止将来修改日期的文件出错.

我在链接线程中找到的其他变体对我不起作用.



4> Peter2711..:

请使用以下命令

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'


谢谢你,在Windows工作.刚用7zip打开jar,删除了.SF文件.我没有要删除的.RSA文件
谢谢,我有intellij 14的这个问题,你的解决方案适合我!
哇,我能说这个解决方案很棒吗(我在这个过程中学到了非常强大的功能!)这需要更多的支持.

5> Nrj..:

此处列出的解决方案可能提供指针.

Manifest主要属性的签名文件摘要无效

底线:

最好保留官方jar,只需将其作为依赖项添加到应用程序jar文件的清单文件中.


不幸的是,我们中的一些人使用"maven shade plugin"这样的东西,因此在这些情况下包括原始jar的逐字副本并不那么容易......
我如何在清单文件中反映这一点?我以前从未编辑过.我正在使用Xcode,常见的惯例是将外部jar库放在myproject/lib目录中以供包含,这就是我正在做的事情.
在清单文件中尝试Class-Path:LIB_PACKAGE /.

6> Travis..:

使用IntelliJ IDEA 14.01时出现此问题.

我能够解决它:

文件 - >项目结构 - >添加新(工件) - > jar->从模块窗口创建Jar的具有依赖性的模块:

选择你的主要课程

来自库的JAR文件选择复制到输出目录并通过清单链接


是否可以将依赖罐放入目标罐中?

7> MattW..:

安全性已经是一个棘手的话题,但我很失望地看到最流行的解决方案是删除安全签名.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证书.



8> Kim Stebel..:

假设你使用ant构建jar文件,你可以指示ant省略META-INF目录.这是我的蚂蚁目标的简化版本:


    
    
        
    



9> m.nguyencntt..:

在引用某处后,我遇到了同样的问题,它的工作方式如下所示:


    org.apache.maven.plugins
    maven-shade-plugin
    3.2.1
    
        false
    
    
        
            package
            
                shade
            
            
                
                    
                        *:*
                        
                            META-INF/*.SF
                            META-INF/*.DSA
                            META-INF/*.RSA
                        
                    
                
            
        
    

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有