2011-10-07 3 views
8

Qualcuno l'ha già fatto prima? L'unico riferimento che ho trovato su google è stato: http://onjava.com/onjava/2001/04/12/signing_jar.html che utilizza ancora sole * classi che causeranno problemi ...Come si firmano a livello di codice i file jar in Java?

Abbiamo trovato questo pure, ma non funziona con java16:. https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

+2

si potrebbe semplicemente chiamare il processo firmatario jar da dentro java. meglio usare ProcessBuilder. – clamp

risposta

0

Sono usando lo SingJar Ant task (che apparentemente chiama lo strumento da riga di comando sotto). Dovrebbe essere possibile chiamarlo a livello di programmazione.

+0

era alla ricerca di qualcosa che non chiamasse 'jarsigner' - tutto fatto in java ... – wuntee

+1

@ wuntee: Sospetto che gli Ant taks lo farebbero se fosse facilmente possibile. –

2

Nel file tools.jar è la classe sun.security.tools.JarSigner che ha un metodo run statico (ava.lang.String [] stringhe) che utilizza gli stessi parametri dell'eseguibile jarsigner.

Così si può chiamare qualcosa come:

sun.security.tools.JarSigner.run(new String[] { 
    "-keystore", keystoreFile.getAbsolutePath(), 
    "-storepass", keystorePassword, 
    outFile.getAbsolutePath(), 
    keystoreAlias 
}); 

È necessario assicurarsi tools.jar è nel classpath per la compilazione e l'esecuzione.

3

Per risolvere un'improvvisa modifica delle restrizioni di sicurezza nelle applicazioni WebStart in Java 7u45 è stato creato uno simple signed jar file generator. Usa il modulo bcpkix di Guava 15 e Bouncy Castle. Dovrebbe essere eseguito su Java 6 & 7. È adatto solo per file di piccole dimensioni. Usalo per qualsiasi scopo tu voglia.

3

Si noti che la classe sun.security.tools.JarSigner è stata scritta per essere utilizzata come utilità della riga di comando e non è stata progettata per essere chiamata dal codice Java. Di conseguenza, la gestione degli errori è piuttosto brusca: il codice stamperà semplicemente un messaggio di errore sullo standard e quindi chiama System.exit()1.

Ciò significa che se si chiama la classe dal proprio codice Java e si verifica un errore quando si tenta di firmare un jar, la JVM che esegue il codice si interromperà semplicemente. Questo può andare bene a seconda della situazione, ma se il tuo codice è di lunga durata o funziona come un servizio, non è così buono.

È quindi preferibile chiamare lo strumento jarsigner utilizzando ProcessBuilder come da commento della pinza. È quindi possibile chiamare waitFor() sull'oggetto Process risultante e verificare exitValue() per verificare se il comando ha avuto esito positivo. getInputStream() consente di leggere qualsiasi messaggio di errore che è stato scritto sullo standard se l'operazione non riesce.

Problemi correlati