我如何取消jar子?

有没有办法取消签名java jar文件? 我有一些我正在尝试在我的开发环境中使用的签名jar子,但我得到安全例外,所以我想取消签名这些jar子,我可以在以后准备部署时签名。

我不知道答案,但这就是我要做的:

  1. 解压缩jar文件或有问题的文件(jar只是拉链)
  2. 在META-INF目录中查找不是MANIFEST-MF的内容。
  3. 删除那些东西。
  4. 打开MANIFEST-MF并删除看起来与签名相关的内容。
  5. rejar。

要从jar文件中删除签名,请从中删除META-INF目录。 jar文件是一个zip文件,因此在Linux上你可以这样做:

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

如果您有许多jar文件要取消签名,则以下命令会对当前目录及下面的每个jar文件执行此操作:

 find . -name '*.jar' -exec zip -d '{}' 'META-INF/*.SF' 'META-INF/*.RSA' ';' 

我看到答案已被接受,但我认为这可能是有用的:

我已经做了一些事情(部分来自其他post)来自动完成任务。
附带没有任何保修,但它适用于我:)
删除签名信息时复制Jar文件。
注意,MANIFEST只留下MAIN部分!

使用javac JarUnsigner.java创建.class文件
使用java -cp JarUnsigner

 import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; public class JarUnsigner { private static final String MANIFEST = "META-INF/MANIFEST.MF"; public static void main(String[] args){ if (args.length!=2){ System.out.println("Arguments:  "); System.exit(1); } String infile = args[0]; String outfile = args[1]; if ((new File(outfile)).exists()){ System.out.println("Output file already exists:" + outfile); System.exit(1); } try{ ZipFile zipFile = new ZipFile(infile); final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outfile)); for (Enumeration e = zipFile.entries(); e.hasMoreElements();) { ZipEntry entryIn = (ZipEntry) e.nextElement(); if (! exclude_file( entryIn.getName() ) ) { /* copy the entry as-is */ zos.putNextEntry( new ZipEntry( entryIn.getName() )); InputStream is = zipFile.getInputStream(entryIn); byte[] buf = new byte[1024]; int len; while ((len = (is.read(buf))) > 0) { zos.write(buf, 0, len); } zos.closeEntry(); } else { if (MANIFEST.equals(entryIn.getName())){ /* if MANIFEST, adjust the entry */ zos.putNextEntry(new ZipEntry(MANIFEST)); // manifest entries until first empty line. ie the 'MainAttributes' section // (this method is used so to keep the formatting exactly the same) InputStream mIS = zipFile.getInputStream(entryIn); BufferedReader in = new BufferedReader(new InputStreamReader(mIS)); String line = in.readLine(); byte[] mNL = "\n".getBytes("UTF-8"); while( line != null && !line.trim().isEmpty() ) { zos.write( line.getBytes("UTF-8")); zos.write( mNL ); line = in.readLine(); } zos.write( mNL ); zos.closeEntry(); }else{ /* else: Leave out the Signature files */ } } } zos.close(); System.out.println("Successfully unsigned " + outfile); }catch(IOException ex){ System.err.println("Error for file: " + infile); ex.printStackTrace(); System.exit(1); } } /** * Exclude .SF signature file * Exclude .RSA and DSA (signed version of .SF file) * Exclude SIG- files (unknown sign types for signed .SF file) * Exclude Manifest file * @param filename * @return */ public static boolean exclude_file(String filename){ return filename.equals("META-INF/MANIFEST.MF") || filename.startsWith("META-INF/SIG-") || filename.startsWith("META-INF/") && ( filename.endsWith(".SF") || filename.endsWith(".RSA") || filename.endsWith(".DSA") ); } } 

在ANT中使用以取消一堆jar子,如下所示:

           

我通过小修改成功validation了DwB的答案: 是否有快速方法从Jar / war中删除文件而无需提取jar并重新创建它? 状态,只能从jar工具中删除是不可能的。 我需要在专有的构建脚本中做一些小改动,我不想重新开始整个jar。

当我只重要的.RSA文件零大小时,我意识到无法签名。 这只能通过jar u命令完成:

 cd %JAR_DIR% jar xvf myapp.jar META-INF/MYAPP.RSA type nul > META-INF/MYAPP.RSA jar uvf myapp.jar META-INF/MYAPP.RSA rmdir /S/Q META-INF 

如果jar子是由您开发的,那么它们可以被信任,您可能不需要签名。 但是,如果从外部获取它们,则应在使用它们之前调查安全性exception的原因。

如果你看一下jarsigner工具及其作用,它会生成3件事:1).SF文件(签名文件)2)基于所用算法的签名块文件(例如.RSA,.DSA等)3 )修改或创建MANIFEST.MF文件

简介:要“取消对jar的设置”,只需删除前两个文件(.sf和.dsa / rsa FILE)。 删除MANIFEST.MF文件,或打开它并删除为每个.class和其中列出的其他文件列出的所有哈希值。

因此,如果删除META-INF目录中的所有内容,则存在删除可能需要的jar的其他资源(即属性文件等)的风险。 删除“看起来与签名相关”的所有内容的这种“霰弹枪方法”是有害的,并且不遵循以下原则:第1对你的.jar没有伤害。

请看: https : //docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html

https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html

了解签名和validation

“…当您签署JAR文件时,您的公钥将与相关证书一起放入存档中,以便任何想要validation签名的人都可以轻松使用它。摘要和签名文件

签署JAR文件时,归档中的每个文件都会在归档的清单中提供摘要条目。 以下是此类条目的示例:

名称:test / classes / ClassOne.class SHA1-Digest:TD1GZt8G11dXY2p4olSZPc5Rj64 =

签名JAR文件时,会自动生成签名文件并将其放在JAR文件的META-INF目录中,该目录包含存档的清单。 签名文件的文件名扩展名为.SF。

签名块文件

除签名文件外,签名JAR文件时,签名块文件将自动放置在META-INF目录中。 与清单文件或签名文件不同,签名块文件不是人类可读的。

签名块文件包含validation所必需的两个元素:

使用签名者私钥生成的JAR文件的数字签名包含签名者公钥的证书,任何想要validation签名JAR文件的人都可以使用签名块文件名通常具有.DSA扩展名,表明它们已创建通过默认的数字签名算法。 如果使用与其他标准算法相关联的密钥进行签名,则可以使用其他文件扩展名。