Frage

Ich bin zu wollen ein Glas mit jarsigner zu unterzeichnen, stellen Sie sicher, es eine Java-Anwendung, die das signierte Glas als Teil von ihm ist nicht Classpath hat (das heißt nur eine Position im Dateisystem des Glases verwendet wird)

Nun mein Problem ist immer die Signaturdatei aus dem Glas, gibt es eine einfache Möglichkeit, dies zu tun?

Ich habe kein Glück ein Spiel mit dem Inflater und Jar Inputstreams hat.

Oder ist dies etwas, das in einer besseren Art und Weise erreicht werden kann?

Danke

War es hilfreich?

Lösung

Die Sicherheit Provider Einführungsleitfaden skizziert den Prozess JAR-Dateien verifizieren. Obwohl diese Anweisungen für einen JCA Cryptographic Service Provider sind, sich selbst zu überprüfen, sollten sie für Ihr Problem anwendbar sein.

Insbesondere kontrollieren die verify(X509Certificate targetCert) Verfahren in dem Beispielcode out "MyJCE.java" .

Andere Tipps

Sie können einfach die JAR mit java.util.jar.JarFile öffnen und sagen, dass es die JAR-Datei zu überprüfen. Wenn die JAR signiert ist, dann hat JarFile die Möglichkeit, es zu überprüfen (die standardmäßig aktiviert ist). Allerdings wird JarFile auch offen unsigned JARs glücklich, deshalb müssen Sie auch prüfen, ob die Datei signiert ist. Sie können dies tun, indem Sie die JAR-Manifest für * -Digest Überprüfung Attribute:. Elemente mit ein solches Attribut Attribut unterzeichnet

Beispiel:

JarFile jar = new JarFile(new File("path/to/your/jar-file"));

// This call will throw a java.lang.SecurityException if someone has tampered
// with the signature of _any_ element of the JAR file.
// Alas, it will proceed without a problem if the JAR file is not signed at all
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF"));
Manifest man = new Manifest(is);
is.close();

Set<String> signed = new HashSet();
for(Map.Entry<String, Attributes> entry: man.getEntries().entrySet()) {
    for(Object attrkey: entry.getValue().keySet()) {
        if (attrkey instanceof Attributes.Name && 
           ((Attributes.Name)attrkey).toString().indexOf("-Digest") != -1)
            signed.add(entry.getKey());
    }
}

Set<String> entries = new HashSet<String>();
for(Enumeration<JarEntry> entry = jar.entries(); entry.hasMoreElements(); ) {
    JarEntry je = entry.nextElement();
    if (!je.isDirectory())
        entries.add(je.getName());
}

// contains all entries in the Manifest that are not signed.
// Ususally, this contains:
//  * MANIFEST.MF itself
//  * *.SF files containing the signature of MANIFEST.MF
//  * *.DSA files containing public keys of the signer

Set<String> unsigned = new HashSet<String>(entries);
unsigned.removeAll(signed);

// contains all the entries with a signature that are not present in the JAR
Set<String> missing = new HashSet<String>(signed);
missing.removeAll(entries);

Sie können entry.getCodeSigners verwenden () in der JAR die Unterzeichner für einen bestimmten Eintrag zu erhalten.

Achten Sie auf die JarFile öffnen mit verifizieren = true und in vollem Umfang die JAR-Eintrag zu lesen, bevor entry.getCodeSigners () aufrufen.

So etwas könnte verwendet werden, um jeden Eintrag zu überprüfen, die nicht eine Signaturdatei ist:

boolean verify = true;
JarFile jar = new JarFile(signedFile, verify);

// Need each entry so that future calls to entry.getCodeSigners will return anything
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
   JarEntry entry = entries.nextElement();
   IOUtils.copy(jar.getInputStream(entry), new NullOutputStream());
}

// Now check each entry that is not a signature file
entries = jar.entries();
while (entries.hasMoreElements()) {
    JarEntry entry = entries.nextElement();
    String fileName = entry.getName().toUpperCase(Locale.ENGLISH);
    if (!fileName.endsWith(".SF")
       && !fileName.endsWith(".DSA")
       && !fileName.endsWith(".EC")
       && !fileName.endsWith(".RSA")) {

       // Now get code signers, inspect certificates etc here...
       // entry.getCodeSigners();
    }
 }

Sie können die jarsigner Anwendung verwenden, um dies zu tun. In Process (oder Runtime.exec) Sie den Befehl mit diesen Argumenten ausführen

 ProcessBulider pb = new ProcessBuilder("/usr/bin/jarsigner", "-verify", "-certs", f.getAbsolutePath());

und wenn der Ausgang contians prüfte dann das Glas signiert

Process p = pb.start();
p.waitFor();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null)
{
if(line.contains("verified");
...

Es gibt mehr komplizierte Dinge, die Sie tun können, wenn Sie die Ausgabe des jarsigner Code haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top