web-dev-qa-db-de.com

Wie lösche ich ein Glas?

Gibt es eine Möglichkeit, die Signatur einer Java-JAR-Datei aufzuheben? Ich habe einige signierte Jars, die ich in meiner Entwicklungsumgebung verwenden möchte, aber ich bekomme Sicherheitsausnahmen. Daher möchte ich diese Jars abmelden und kann sie später signieren, wenn ich bereit bin.

22
Jason

Ich weiß die Antwort nicht, aber hier ist, was ich tun würde:

  1. Entpacken Sie die JAR-Datei oder die fraglichen Dateien (JARs sind nur Reißverschlüsse)
  2. Suchen Sie im META-INF-Verzeichnis nach etwas, das nicht MANIFEST-MF war.
  3. Löschen Sie das Zeug.
  4. Öffnen Sie den MANIFEST-MF und entfernen Sie alles, was aussah, als würde es sich um eine Signatur handeln.
  5. rejar.
25
DwB

Entfernen Sie zum Entfernen der Signatur aus einer JAR-Datei das Verzeichnis META-INF. Eine JAR-Datei ist eine Zip-Datei. Unter Linux können Sie dies folgendermaßen tun:

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

Wenn Sie viele JAR-Dateien zum Abmelden haben, führt der folgende Befehl dies für jede JAR-Datei im aktuellen Verzeichnis und darunter aus:

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

Ich sehe, dass eine Antwort bereits akzeptiert wurde, aber ich denke, dass dies trotzdem nützlich sein könnte:

ich habe mir etwas ausgedacht (teilweise aus anderen Beiträgen), um die Aufgabe zu automatisieren.
Kommt mit keiner Garantie, aber es funktioniert für mich :)
Kopiert die Jar-Datei, während die Signaturinformationen entfernt werden.
Bitte beachten Sie, dass das MANIFEST nur mit der MAIN-Sektion belassen wird!

Verwenden Sie javac JarUnsigner.Java, um die .class-Datei zu erstellen
Java -cp <class dir> JarUnsigner <inJar> <outJar> verwenden

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") );
  }

}

Verwenden Sie in ANT, um eine Reihe von Gläsern wie folgt zu entfernen:

<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> 
7
Houtman

Ich habe die Antwort von DwB mit einer kleinen Änderung erfolgreich überprüft: Als Gibt es eine schnelle Möglichkeit, eine Datei aus einem Jar/War zu löschen, ohne das Jar extrahieren und neu erstellen zu müssen? Staaten, Löschen nur aus Jar-Tool ist nicht möglich. Ich musste nur eine kleine Änderung am proprietären Build-Skript vornehmen und wollte nicht das ganze Glas neu aufsetzen.

Ich erkannte, dass ein unsignieren möglich war, als ich nur eine wichtige .RSA-Datei mit der Größe Null anfertigte. Dies kann nur mit dem Befehl jar u erreicht werden:

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
1

Wenn die Gläser dann von Ihnen entwickelt wurden, können sie vertraut werden und Sie müssen sie wahrscheinlich nicht signieren. Wenn Sie sie jedoch von außerhalb erhalten haben, sollten Sie untersuchen, warum die Sicherheitsausnahme auftritt, bevor Sie sie verwenden.

0
RHT

Wenn Sie sich das Jarsigner-Tool und seine Funktionsweise ansehen, werden drei Dinge generiert: 1) die .SF-Datei (Signaturdatei) 2) eine Signaturblockdatei, die auf dem verwendeten Algorithmus basiert (z. B. .RSA, .DSA usw.) 3 ) Änderung oder Erstellung einer MANIFEST.MF-Datei

Zusammenfassung: Um die Signatur eines JARs aufzuheben, löschen Sie einfach die ersten beiden Dateien (.sf und .dsa/rsa FILE). Löschen Sie entweder die Datei MANIFEST.MF oder öffnen Sie sie und löschen Sie alle dort aufgeführten Hashes für jede .class- und andere Datei.

Wenn Sie also ALLES im META-INF-Verzeichnis löschen, besteht die Gefahr, dass andere Ressourcen des JAR gelöscht werden, die möglicherweise benötigt werden (z. B. Eigenschaftendateien usw.). Dieser "Schrotflintenansatz" zum Löschen von allem, was "signaturbezogen aussieht", ist schädlich und folgt nicht dem Prinzip: 1. Fügen Sie Ihrem .jar keinen Schaden zu.

siehe hier: https://docs.Oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html

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

Grundlegendes zum Signieren und Überprüfen

Msgstr "... Wenn Sie eine JAR - Datei signieren, wird Ihr öffentlicher Schlüssel zusammen mit einem zugehörigen Zertifikat im Archiv abgelegt, damit er von jedem, der Ihre Signatur überprüfen möchte, problemlos verwendet werden kann .... Digests und die Signaturdatei

Wenn Sie eine JAR-Datei signieren, erhält jede Datei im Archiv einen Digest-Eintrag im Manifest des Archivs. Hier ist ein Beispiel, wie ein solcher Eintrag aussehen könnte:

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

Wenn eine JAR-Datei signiert wird, wird automatisch eine Signaturdatei generiert und im META-INF-Verzeichnis der JAR-Datei abgelegt, in dem sich auch das Manifest des Archivs befindet. Signaturdateien haben Dateinamen mit der Erweiterung .SF.

Die Signaturblockdatei

Zusätzlich zur Signaturdatei wird beim Signieren einer JAR-Datei automatisch eine Signaturblockdatei im META-INF-Verzeichnis abgelegt. Anders als die Manifestdatei oder die Signaturdatei können Signaturblockdateien nicht von Menschen gelesen werden.

Die Signaturblockdatei enthält zwei Elemente, die für die Überprüfung erforderlich sind:

Die digitale Signatur für die JAR-Datei, die mit dem privaten Schlüssel des Unterzeichners generiert wurde Das Zertifikat mit dem öffentlichen Schlüssel des Unterzeichners, das von allen Personen verwendet werden soll, die die signierte JAR-Datei überprüfen möchten. Signaturblock-Dateinamen haben normalerweise die Erweiterung .DSA, die angibt, dass sie erstellt wurden durch den Standard-Algorithmus für digitale Signaturen. Andere Dateinamenerweiterungen sind möglich, wenn zum Signieren Schlüssel verwendet werden, die einem anderen Standardalgorithmus zugeordnet sind.

0
atom88