Как мне отписать jar-файл?

Есть ли способ отменить подпись java-файла jar ? У меня есть несколько подписанных jar-файлов, которые я пытаюсь использовать в своей среде разработки, но я получаю исключения безопасности, поэтому я хочу отменить подпись этих jar-файлов, и я могу подписать их позже, когда буду готов к развертыванию.

25
задан Eiko 23 August 2016 в 06:33
поделиться

3 ответа

Я не знаю ответа, но вот что я хотел бы сделать:

  1. Разархивировать файл или файлы, о которых идет речь (банки - просто почтовые индексы)
  2. Посмотрите на каталог META-INF для чего-то, что не было MANIFEST-MF.
  3. Удалить этот материал.
  4. Откройте MANIFEST-MF и удалите вещи, которые выглядели так, как будто они были связаны с подписью.
  5. rejar.
26
ответ дан 28 November 2019 в 20:49
поделиться

Я вижу, что ответ уже принят, но я думаю, что это может быть полезно в любом случае:

Я что-то приготовил (частично из других сообщений), чтобы автоматизировать задачу.
Поставляется без каких-либо гарантий, но работает для меня:)
Копирует файл Jar при удалении информации о подписи.
Обратите внимание, манифест остается только с разделом ГЛАВНАЯ!

Используйте javac JarUnsigner.java для создания файла .class
Используйте java -cp <class dir> JarUnsigner <inJar> <outJar>

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: <infile.jar> <outfile.jar>");
      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. i.e. 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, чтобы подписать несколько банок следующим образом:

<apply executable="java" dest="${output-dir}"> 
  <arg value="-cp" />
  <arg value="${dev-dir}" />
  <arg value="JarUnsigner" />
  <srcfile/> 
  <targetfile/>
  <fileset dir="${input-dir}" includes="*.jar"/> 
  <mapper type="glob" from="*.jar" to="*.jar"/> <!-- uses "dest"-->
</apply> 
8
ответ дан 28 November 2019 в 20:49
поделиться

Если банки были разработаны вами, им можно доверять, и вам, вероятно, не нужно их подписывать. Однако, если вы получили их извне, вам следует выяснить, почему возникает исключение безопасности, прежде чем их использовать.

0
ответ дан 28 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: