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:
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"

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à:
- Acquistiamo un certificato ufficiale e provvediamo a firmare il nostro applet;
- 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:
Confermiamo comunque e, dopo qualche istante, vedremo aprirsi magicamente il Notepad
Per maggiori informazioni è possibile far riferimento alla guida della Sun sulle Applet reperibile a questo indirizzo.
