Generar el MANIFEST.MF

En referencia al post anterior. Ahora vamos a ver como se genera el manifest.

En consola

jar cfm jar-file manifest-addition input-file(s)
  • c: indica que quieres crear un fichero JAR.
  • m: indica que quieres unir informacion de un fichero en el manifest que estas creando.
  • f: indica salida a un fichero en lugar de por consola
  • manifest-addition: nombre del fichero que contiene la informacion a agregar al manifest.
  • jar-file: nombre del JAR resultante.
  • input-file(s): lista de ficheros que quieres que esten en tu JAR.

El contenido del manifest estara en UTF-8
Referencia.

Con Maven

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
				  <archive>
				    <index>true</index>
		            <manifest>
		              <addClasspath>true</addClasspath>
		            </manifest>
		            <manifestEntries>
		              <Permissions>all-permissions</Permissions>
		              <Codebase>*.prietopalacios.net</Codebase>
		              <Application-Library-Allowable-Codebase>*.prietopalacios.net</Application-Library-Allowable-Codebase>
		              <Caller-Allowable-Codebase>*.prietopalacios.net</Caller-Allowable-Codebase>
		              <Trusted-Library>true</Trusted-Library>
		              <Trusted-Library>true</Trusted-Library>
		            </manifestEntries>
		          </archive>
				</configuration>
			  </plugin>
Generar el MANIFEST.MF

Aumentar la seguridad de los MANIFEST.MF

Atributos:
Permissions: utilice el atributo «Permissions» para ayudar a evitar que alguien utilice su jar firmado en otra aplicacion y lo pueda ejecutar en un nivel de privilegio diferencte. Establezca este atributo en uno de los siguientes valores:

  • sandbox – Indica que la RIA se ejecuta en el entorno limitado de seguridad y no requiere de permisos adicionales.
  • all-permissions: todos los permisos, indica que el RIA requiere el acceso a los recursos del sistema del usuario.

RIA: Rich Internet Applications

Codebase: restringe el uso del jar a un dominio especifico:
Codebase: * todos
Codebase: *.example.com todos los subdominios del dominio example.com. Esto incluye http://www.example.com. www es un subdominio.
Codebase: 127.0.0.1, en el servidor local en todos los puertos.
Codebase: 127.0.0.1:8080, solo en el puerto 8080 del servidor local.
Application-Name: nombre de la aplicacion. Es recomendable para que el usuario pueda confiar en la aplicacion. Aparece una ventana mostrando el nombre de la aplicacion, indicando si la quieres ejecutar o no.

Application-Library-Allowable-Codebase: identifica la localizacion donde el jar sera ejecutado. Este atributo se utiliza para determinar lo que aparece en el campo Ubicación de la pregunta de seguridad que se muestra a los usuarios cuando el archivo JAR para su RIA está en una ubicación diferente a la página del archivo JNLP o HTML que se inicia el RIA.
Application-Library-Allowable-Codebase: https://host.example.com *.samplehost.com/apps
Caller-Allowable-Codebase: identifica el dominio desde el cual el codigo JavaScript puede hacer llamadas a la RIA sin indicaciones de seguridad. Establezca este atributo en el dominio que aloja el código JavaScript.
Caller-Allowable-Codebase: host.example.com 127.0.0.1
Trusted-Only: solo clases de confianaz. No ejecuta clases que no esten firmadas.
Trusted-Library: solo librerias de confianza. Firmadas.

Referencia

Aumentar la seguridad de los MANIFEST.MF

Firmar un JAR

para firmar un jar es muy sencillo, basta tener la JDK, un «key store» con su user/pass/alias/private pass.

A la hora de firmar un jar lo que se hace es:
1.- generar un hash de cada clase en SHA y lo agrega al manifest de la siguiente manera

Manifest-Version: 1.0
Implementation-Vendor: Gobierno de Espana
Implementation-Title: es.gob.afirma
Implementation-Version: build01
Application-Library-Allowable-Codebase: *
Specification-Vendor: Gobierno de Espana
Application-Name: Applet Cliente Afirma
Name: es/gob/afirma
Permissions: all-permissions
Specification-Title: Applet Cliente Afirma
Specification-Version: 3.3.1 u5
Caller-Allowable-Codebase: *
Codebase: *

Name: org/bouncycastle/jcajce/provider/digest/Whirlpool$Digest.class
SHA-256-Digest: FKks3RbQC/oJ2jlI2P9GKwYkEQdZNBOUW6dFI8uVdmM=

...

2.- Agrega unos ficheros que contienen el certificado, con el que se ha firmado, en la misma carpeta donde esta el MANIFEST.MF

En consola

jarsigner -keystore keystore.jks -storepass keystore_pass -keypass keystore_pass -signedjar jarsfirmados/LO_QUE_SEA.jar -verbose jars/LO_QUE_SEA.jar keystore_alias

Maven

			  <plugin>
				    <groupId>org.apache.maven.plugins</groupId>
				    <artifactId>maven-jarsigner-plugin</artifactId>
				    <version>1.2</version>
				    <executions>
				        <execution>
				            <id>sign</id>
				            <goals>
				                <goal>sign</goal>
				            </goals>
				        </execution>
				    </executions>
				    <configuration>
				        <keystore>/path/to/testkeystore</keystore>
				        <alias>myalias</alias>
				        <storepass>depo.root</storepass>
				    </configuration>
				</plugin>
Firmar un JAR