feb 8 2008

Creare un’applet firmata in Java

Nei giorni scorsi ho ripreso un pò di programmazione in Java, così, per fare due prove e vedere se finalmente riuscivo a creare un'applet in Java.

Anche se alcuni potrebbero pensare che creare applet in Java da utilizzare sul Web faccia molto web 1.0 posso solo dire che, in taluni casi, è l'unico modo per fare delle operazioni automatizzate sul client su cui girerà l'applet stessa :-)

Tralascio di descrivere che cosa sia un'applet Java (per cui rimando alla relativa voce su Wikipedia) per soffermarmi, innanzi tutto, sulle (giuste) limitazioni.

Quando un'applet viene eseguita all'interno di un Web Browser questi avrà a accesso ad un'area ben delimitata definita sandbox in modo che un (eventuale) malintenzionato non possa accedere alla macchina in locale, non possa effettuare chiamate a procedure che non risiedano sul dominio stesso da cui è stato eseguito, ecc.

Nella stragrande maggioranza dei casi quanto messo a disposizione basta e avanza.
Il problema sorge, però, se si debba effettuare legittimamente delle operazioni sulla macchina client che ha mandato in esecuzione l'applet stessa.
Poniamo, ad esempio, di voler mandare in esecuzione un programma sulla macchina client.

Innanzi tutto dobbiamo preoccuparci di scrivere il codice per l'applet:

  1. <title>Prova applet</title>
  2. </head>
  3. <applet code=applet.class
  4. archive=applet.jar width=300 height=150></applet>
  5. </body>
  6. </html>

Lo salviamo come applet.java e lo compiliamo con il comando:

javac applet.java

cosi da avere a disposizione il bytecode (applet.class).

A questo punto creiamo il file JAR contenente i vari componenti necessari con il seguente comando:

jar cvf applet.jar applet.class

Scriviamo una semplice pagina HTML con, ad esempio, questo codice:

A questo punto se tentiamo di accedere al file da un qualunque browser che supporti Java otteremo, nel riquadro dove dovrebbe essere visualizzata l'applet, una laconica "pagina morta"

Errore esecuzione applet

Il perché è presto detto.

Infatti basta andare a vedere cosa ci ha scritto il JRE sulla console:
java.security.AccessControlException: access denied (java.io.FilePermission c:\windows\notepad.exe execute)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkExec(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at applet.init(applet.java:16)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Giustamente si è incavolato perché abbiamo tentato di accedere al sistema in locale!

Per ovviare, abbiamo necessità di firmare digitalmente il file JAR che abbiamo creato.
A questo punto si presentano due possibilità:

  1. Acquistiamo un certificato ufficiale e provvediamo a firmare il nostro applet;
  2. Generiamo un certificato generico auto-firmato a costo zero.

Per non appesantire questo post, per la generazione del certificato rimando a quest'altro mio articolo.

Provvediamo, a questo punto, a firmare il nostro file JAR eseguendo il seguente comando:

jarsigner applet.jar nomedellachiave -signedjar applet.jar.sign

Ci verrà richiesto di inserire la password della chiave che prontamente faremo confermando con un bel invio.

A questo punto provvediamo a modificare il codice della pagina HTML sostituendo applet.jar con applet.jar.sign.

Apriamo nuovamente il file HTML con un browser web.
Questa volta verrò visualizzato un messaggio con il quale veniamo avvisati che il certificato digitale utilizzato per firmare l'applet non viene riconosciuto come attendibile:

Notifica certificato applet

Confermiamo comunque e, dopo qualche istante, vedremo aprirsi magicamente il Notepad :-D

Per maggiori informazioni è possibile far riferimento alla guida della Sun sulle Applet reperibile a questo indirizzo.


gen 30 2008

Generare un certificato per firmare applet Java

Avendo la necessità di fare delle prove con delle applet Java che devono accedere alle risorse del sistema locale su cui vengono eseguite è sorta la necessità di doverle firmare digitalmente in quanto solo così possono "uscire" dalla sandbox in cui vengo rinchiuse quando sono in esecuzione.

Facendo un pò di ricerche su Internet ho trovato diversi documenti in inglese e pochissimi (tanto per cambiare) in italiano percui, a mia futura memoria, riporto di seguito i procedimenti per creare un certificato digitale auto-generato per firmare le proprie applet scritte in Java.

I comandi da eseguire sono i seguenti:

keytool -genkey -alias nomeDellaChiave

Verrà richiesto di inserire alcune informazioni (le cui spiegazioni esulano dallo scopo di questo articolo). Vediamo cosa inserire:

Enter keystore password:

Inserire una password di almeno 6 caratteri. Per le necessità va bene anche 123456

What is your first and last name?
[Unknown]:

Inserire il proprio nome e cognome. Esempio Mario Rossi

What is the name of your organizational unit?
[Unknown]:

Inserire il nome del servizio. Esempio Divisione Assistenza

What is the name of your organization?
[Unknown]:

Inserire il nome dell'azienda. Esempio Banca del Sapone S.p.A.

What is the name of your City or Locality?
[Unknown]:

Inserire il nome della città. Esempio Roma

What is the name of your State or Province?
[Unknown]:

Inserire le due lettere della provincia. Esempio RM

What is the two-letter country code for this unit?
[Unknown]:

Inserire le due lettere della nazione secondo la notazione ISO-3166. Esempio IT

Is CN= Mario Rossi, OU=, O=Banca del Sapone S.p.A., L=Roma, ST=RM, C=IT correct?
[no]:

Inserire yes (nella versione italiana del JDK bisognona inserire si) e confermare con invio.
Verrà visualizzato:

Enter key password for <nomeDellaChiave>
(RETURN if same as keystore password):

Si può confermare direttamente con invio.

Giunti a questo punto conviene memorizzarsi anche su un file separato la chiave generata (ed archiviarla in un posto "sicuro") con il comando:

keytool -export -alias nomeDellaChiave -file nomeDelFile.crt

Ora è possibile firmare digitalmente i nostri progetti con il certificato appena creato.