Java

De Astillas.net
Java-logo.png

Enlaces y referencias

Configuración

Localización de bibliotecas de clases

Un programa Java que emplee clases de usuario usa la variable de entorno CLASSPATH para localizarlas. El valor predeterminado es el directorio de trabajo actual (.) y según la documentación esta variable deberá contener cada ruta separada por un carácter punto y coma (;) y referirse a:

  • Un archivo .jar o .zip que contenga archivos .class.
  • Un directorio si contiene archivos .class sin nombre o si contiene el paquete raíz de una colección de clases.

Las herramientas Java de consola (como java, javac y javadoc entre otras) también admiten el uso del parámetro -classpath para llevar a cabo la misma función.

Recetario

Programas Java como servicios

keytool

El programa keytool sirve para manipular almacenes de claves y certificados digitales empleados por el entorno de ejecución del lenguaje Java. Es una herramienta que viene incluída en el entorno de este lenguaje y tiene las siguientes opciones comunes para gestionar los almacenes.

Parámetro Descripción y valores predeterminados
-storetype

Define el tipo de almacenamiento de claves:

  • jks (Es el formato propietario de Sun y el valor predeterminado)
  • pkcs12
-keystore Indica la ruta del archivo físico del almacén de claves. El valor predefinido es el archivo .keystore en el directorio raíz del usuario.
-storepass Contraseña de acceso al depósito de claves. No puede tener menos de 6 caracteres de longitud y se solicita al usuario si es necesaria y no se ha definido.

Firmando el código

El número de referencias para firmar applets Java resulta sorprendente y aunque existen varios tutoriales todas ellos terminan por emplear el programa jarsigner que suele acompañar al SDK del lenguaje Java.

Autofirma

Creamos una clave privada en un contenedor privado y autofirmado como en la siguiente secuencia:

$ keytool -genkey
Escriba la contraseña del almacén de claves:
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
  [Unknown]:  Peladillo Microbiez
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:  Peladillo
¿Cuál es el nombre de su organización?
  [Unknown]:  Peladillo Inc
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:  Megaciudad
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:  Megaestado
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:  ZZ
¿Es correcto CN=Peladillo Microbiez, OU=Peladillo, O=Peladillo Inc, L=Megaciudad, ST=Megaestado, C=ZZ?
  [no]:  si

Escriba la contraseña clave para <mykey>
        (INTRO si es la misma contraseña que la del almacén de claves):
$

A recordar:

  • Se puede indicar un alias para la clave con el parámetro -alias nombre y si se omite el programa lo nombre como mykey.
  • La contraseña del contenedor de claves es importante y no debe perderse.

Después procedemos a firmar el applet:

$ jarsigner mindterm.jar mykey
Enter Passphrase for keystore:

Warning:
The signer certificate will expire within six months.
$

Hecho lo cual sólo es necesario autorizar la ejecución la primera vez que carguemos el applet en el navegador. El resto de las ocasiones funcionará sin necesidad de contestar nada ... excepto cuando se alcance la fecha de caducidad de la firma, cosa que ocurrirá en seis meses tal y como nos avisa el programa en su último mensaje.

Para inspeccionar el contenedor de claves se puede utilizar lo siguiente:

$ keytool -list
Escriba la contraseña del almacén de claves:

Tipo de almacén de claves: JKS
Proveedor de almacén de claves: SUN

Su almacén de claves contiene entrada 1

mykey, 25-ene-2011, PrivateKeyEntry,
Huella digital de certificado (MD5): 53:82:07:D8:BD:33:5F:63:B3:73:AA:50:0F:E2:13:44

Tras el alias de la clave, vemos la fecha de creación y una etiqueta que identifica el tipo de entrada: keyentry o privatekeyentry indica que está almacenada la clave privada y trusted* que es un certificado confiable sin ella.

cacert.org

Tenemos un certificado firmado por la autoridad de certificación cacert.org y ya que lo empleamos para las conexiones seguras con nuestro servidor, queremos que también nos sirva para poder firmar estos programas que luego servimos.

Pues no. No he podido hacerlo por muchas razones, pero la principal ha sido que cacert.org no proporciona certificados para firma de código si no se cumplen unos requisitos bastante estrictos (y razonables por otra parte).

Tras muchas pruebas siempre he terminado por encontrarme con el aviso

The signer certificate's ExtendedKeyUsage extension doesn't allow code signing.

del programa firmador jarsigner. Probar a cargar un applet como ese produce resultados bastante equívocos puesto que el ejecutor Java, al no poder verificar la firma correctamente, desactiva un montón de capacidades del lenguaje. Las suficientes como para que mindterm no funcione.

Verificando firmas

Empleando el ejemplo anterior de la autofirma tenemos:

jarsigner -verify -verbose -certs mindterm.jar

       68633 Tue Jan 25 11:36:30 CET 2011 META-INF/MANIFEST.MF
       68670 Tue Jan 25 11:36:30 CET 2011 META-INF/MYKEY.SF
        1111 Tue Jan 25 11:36:30 CET 2011 META-INF/MYKEY.DSA
           0 Mon May 17 11:36:32 CEST 2010 META-INF/
           0 Mon May 17 11:18:52 CEST 2010 defaults/
smk      174 Thu Aug 20 18:25:14 CEST 2009 defaults/jaas.conf

      X.509, CN=Peladillo Microbiez, OU=Peladillo, O=Peladillo Inc, L=Megaciudad, ST=Megaestado, C=ZZ (mykey)
      [certificate will expire on 25/04/11 12:33]
...

  s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning:
This jar contains entries whose signer certificate will expire within six months.

Importar certificados

Para importar un certificado de la FNMT en formato PCKS12 a un almacén de claves java hay que indicar el tipo del origen:

$ keytool -importkeystore -srckeystore ~/certificado.p12 -srcstoretype PKCS12 -destkeystore trusted.clientcerts 
...

E indicar (si la tuviesen) la contraseña del almacén de claves java y la contraseña del certificado.

También es destacable recordar que cuando se va a hacer uso del certificado en operaciones de firma hay que indicar obligatoriamente la contraseña del certificado, no la del almacén de claves de java.