Как мне подписать банку? - PullRequest
       22

Как мне подписать банку?

24 голосов
/ 13 октября 2011

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

Ответы [ 6 ]

26 голосов
/ 13 октября 2011

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

  1. Распакуйте файл jar или файлы, о которых идет речь (банки - просто почтовые индексы)
  2. Найдите в каталоге META-INF что-то, что не было MANIFEST-MF.
  3. Удалить этот материал.
  4. Откройте MANIFEST-MF и удалите вещи, которые выглядели так, как будто они были связаны с подписью.
  5. rejar.
13 голосов
/ 17 сентября 2015

Чтобы удалить подпись из файла JAR, удалите из него каталог META-INF.JAR-файл - это ZIP-файл, поэтому в Linux вы можете сделать это:

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

Если у вас есть много JAR-файлов для неподписания, следующая команда выполняет это для каждого JAR-файла в текущем каталоге и ниже:1005 *

find . -name '*.jar' -exec zip -d '{}' 'META-INF/*.SF' 'META-INF/*.RSA' ';'
8 голосов
/ 17 декабря 2015

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

Я что-то приготовил (частично из других сообщений) для автоматизации задачи.
Поставляется без гарантиикак бы то ни было, но у меня это работает:)
Копирует файл 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> 
1 голос
/ 10 июля 2014

Я успешно подтвердил ответ DwB с небольшой модификацией: как Существует ли быстрый способ удалить файл из Jar / war без необходимости извлекать jar и воссоздать его? состояния, удаление только из инструмента jar это невозможно. Мне нужно было внести только небольшие изменения в собственный скрипт сборки, и я не хотел переписывать весь jar.

Я понял, что unsign возможен, только когда я сделал важный файл .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
0 голосов
/ 23 мая 2017

Если вы посмотрите на инструмент jarsigner и то, что он делает, он генерирует 3 вещи: 1) файл .SF (файл подписи) 2) файл блока подписи на основе используемого алгоритма (например, .RSA, .DSA и т. Д..) 3) изменение или создание файла MANIFEST.MF

Краткое описание: чтобы "подписать банку", просто удалите первые 2 файла (.sf и .dsa / rsa FILE).Либо удалите файл MANIFEST.MF, либо откройте его и удалите все хэши, перечисленные для каждого .class и других файлов, перечисленных там).

Итак, если вы удаляете ВСЕ в каталоге META-INF, который вы запускаетериск удаления других ресурсов банки, которые могут понадобиться (например, файлы свойств и т. д.).Этот «подход дробовика» удаления всего, что «похоже на сигнатуру» вреден и не следует принципу: 1-й - не навреди (своему .jar).

см. Здесь: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html

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

Общие сведения о подписи и проверке

"... Когда вы подписываете файл JAR, ваш открытый ключ помещается в архив вместе с соответствующим сертификатом, чтобы его было легкодоступен для использования любому желающему проверить вашу подпись .... Дайджесты и файл подписи

Когда вы подписываете файл JAR, каждому файлу в архиве дается запись дайджеста в манифесте архива. Вот примеро том, как может выглядеть такая запись:

Имя: test / classes / ClassOne.class SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64 =

Когда файл JAR подписан, автоматически создается файл подписи инаходится в каталоге META-INF файла JAR, в том же каталоге, где находится манифест архива. Файлы сигнатур имеют имена файлов с расширением .SF.

Файл блока подписи

В дополнение к файлу подписи файл блока подписи автоматически помещается в каталог META-INF при подписании файла JAR.В отличие от файла манифеста или файла подписи, файлы блока подписи не читаются человеком.

Файл блока подписи содержит два элемента, необходимых для проверки:

Цифровая подпись для файла JAR, который былгенерируется с помощью закрытого ключа подписавшего. Сертификат, содержащий открытый ключ подписывающего лица, должен использоваться любым, кто хочет проверить подписанный файл JAR. Имена файлов блока подписи обычно имеют расширение .DSA, указывающее, что они были созданы с помощью алгоритма цифровой подписи по умолчанию.Другие расширения имени файла возможны, если для подписи используются ключи, связанные с другим стандартным алгоритмом.

0 голосов
/ 13 октября 2011

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

...