2011-10-07 8 views
8

¿Alguien ha hecho esto antes? La única referencia que he encontrado en Google ha sido: http://onjava.com/onjava/2001/04/12/signing_jar.html que todavía utiliza el sol * clases que causarán problemas ...¿Cómo se firman programáticamente archivos jar en Java?

Encontramos este también, pero no funciona con java16:. https://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/JarSigner15.java

+2

puede llamar al proceso jar signer desde dentro de java. Lo mejor es usar ProcessBuilder. – clamp

Respuesta

0

estoy utilizando el SingJar Ant task (que aparentemente llama a la herramienta de línea de comandos debajo). Debería ser posible llamarlo programáticamente.

+0

estaba buscando algo que no se llame 'jarsigner' - todo hecho en java ... – wuntee

+1

@wuntee: sospecho que las tomas Ant lo harían si fuera posible. –

2

En el archivo tools.jar está la clase sun.security.tools.JarSigner que tiene un método de ejecución estática (ava.lang.String [] cadenas) que toma los mismos parámetros que el ejecutable jarsigner.

Así se puede llamar algo así como:

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

Usted necesita asegurarse de tools.jar está en la ruta de clases para la compilación y ejecución.

3

Para abordar un cambio repentino de las restricciones de seguridad en las aplicaciones WebStart en Java 7u45, hemos creado un simple signed jar file generator. Utiliza el módulo bcpkix Guava 15 y Bouncy Castle. Debería ejecutarse en Java 6 & 7. Es adecuado solo para archivos pequeños. Úselo para cualquier propósito que desee.

3

Tenga en cuenta que la clase sun.security.tools.JarSigner se escribió para utilizarse como una utilidad de línea de comandos y no se diseñó para llamarse desde el código Java. Como resultado, el manejo de errores es bastante abrupto: el código simplemente imprimirá un mensaje de error a la salida estándar y luego llamará al System.exit()1.

Esto significa que si llama a la clase desde su código Java y se produce un error cuando intenta firmar un jar, la JVM que ejecuta el código simplemente se detendrá. Esto puede estar bien dependiendo de su situación, pero si su código es de larga duración o actúa como un servicio, no es tan bueno.

Por lo tanto, es mejor llamar a la herramienta jarsigner con ProcessBuilder según el comentario de la abrazadera. A continuación, puede llamar al waitFor() en el objeto de proceso resultante y marcar exitValue() para ver si el comando fue exitoso. getInputStream() le permitirá leer los mensajes de error que se escribieron en la salida estándar si falla la operación.

Cuestiones relacionadas