Newsgroup: it.comp.java
Titolo: Applet e BouncyCastle

Salve a tutti,
premetto che non sono un programmatore java, ma devo cercare di 
personalizzare un'applet per gestire la firma digitale di documenti tramite 
SmartCard.
Ho provato ad utilizzare le boucycastle.
Compilo senza ottenere alcun errore, ma quando carico l'applet mi 
restituisce il seguente errore.
java.lang.RuntimeException: java.lang.NoClassDefFoundError: 
org/bouncycastle/jce/provider/BouncyCastleProvider
 at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
 at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown 
Source)
 at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: 
org/bouncycastle/jce/provider/BouncyCastleProvider
 at java.lang.Class.getDeclaredConstructors0(Native Method)
 at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
 at java.lang.Class.getConstructor0(Unknown Source)
 at java.lang.Class.newInstance0(Unknown Source)
 at java.lang.Class.newInstance(Unknown Source)
 at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
 at java.awt.event.InvocationEvent.dispatch(Unknown Source)
 at java.awt.EventQueue.dispatchEvent(Unknown Source)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: 
org.bouncycastle.jce.provider.BouncyCastleProvider
 at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 ... 14 more
Caused by: java.io.IOException: open HTTP connection 
failed:
http://localhost:4706/WebSite1/org/bouncycastle/jce/provider/BouncyCastleProvider.class
 at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
 at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
 at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 ... 17 more
Eccezione: java.lang.RuntimeException: java.lang.NoClassDefFoundError: 
org/bouncycastle/jce/provider/BouncyCastleProvider
Ho provato a dare un'occhiata in rete e sembra un problema di classpath.
Queste le istruzioni che uso per compilare.
set JAVA5_HOME=C:\Progra~1\Java\jdk1.6.0_20
del *.class
%JAVA5_HOME%\bin\javac -classpath 
.;"%JAVA5_HOME%\jre\lib\plugin.jar";"%JAVA5_HOME%\jre\lib\bcprov-jdk16-145.jar";"%JAVA5_HOME%\jre\lib\bcmail-jdk16-145.jar" 
*.java
del *.jar
%JAVA5_HOME%\bin\jar -cvf SmartCardSignerApplet.jar *.class
%JAVA5_HOME%\bin\jarsigner -keystore SmartCardSignerApplet.jks -storepass 
!secret -keypass !secret SmartCardSignerApplet.jar signFiles
Ormai non so piu dove sbattere la testa.
Questi gli spezzoni di codice salienti senza i quali l'applet parte.
import org.bouncycastle.cms.CMSProcessable;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
Security.addProvider(new BouncyCastleProvider());
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSigner(key, 
(X509Certificate)chain[0],CMSSignedDataGenerator.DIGEST_SHA1);
CMSProcessable content = new CMSProcessableByteArray(data);
CMSSignedData signedData = generator.generate(content, true, "BC");
byte[] sdata = signedData.getEncoded();
C'è qualcuno che può darmi una mano? Grazie infinita.
Un abbraccio
Daniele

  at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
Il problema è che durante l'esecuzione, la JVM non trova nel classpath
la classe indicata. Per risolvere hai due possibilità:
1. includere nel jar dell'applet il jar del provider Bouncy Castle;
2. nella JVM client copiare in JRE/lib/ext il jar.
L'opzione 1 produce un file jar più grande, e quindi un aumento dei
tempi di download dell'applet dal server, ma non ti crea problemi di
installazioni del provide BC sulle macchine client.
L'opzione 2 produce un jar file di dimensioni minime, ma ti crea il
problema di installazioni del provider  BC su tutte le macchine client
dove intendi eseguire l'applet.
Se le dimensioni sono un problema (es. per connessioni lente),
l'opzione 2 è da preferire, assieme a due righe di spiegazione
sull'installazione dell'applet agli utenti finali, i quali devono
andare a scaricarsi il provider dal sito Bouncy Castle e copiarselo
nella cartella in questione.
Se invece le dimensioni non sono un problema, la soluzione 1 è da
preferire, in quanto solleva l'utente finale dall'installazione del
provider.
Allo scopo ti consiglio di utilizzare il file con le lightweight API
di Bouncy Castle, che contiene solo lo stretto necessario, ed è
pensato proprio per l'uso con applet. Se usi JDK 5 (come deduco dalla
variabile JAVA5_HOME), lo trovi all'indirizzo
http://www.bouncycastle.org/download/lcrypto-jdk15-145.zip
. Per JDK 6,
hai a disposizione il file 
http://www.bouncycastle.org/download/lcrypto-jdk16-145.zip
.
Per includere il file nel jar dell'applet, basta utilizzare il comando
jar, in cui, oltre ai file class, includi anche il jar di BC.
Spero di esserti stato di aiuto.
Buona giornata

 jar, in cui, oltre ai file class, includi anche il jar di BC.
Ho dato un'occhiata alla sintassi del comando jar ma non ho capito come fare 
ad includere i jar delle boucycastle.
Ti volevo chiedere inoltre, non basta averle messe nel comando javac? Se non 
le metto mi da ovviamente errore in fase di compilazione.
Ti ringrazio per la tua disponibilità.
Un abbraccio
Daniele 

 le metto mi da ovviamente errore in fase di compilazione.
javac è usato per compilare, jar per creare la distribuzione finale
(che poi è in pratica un file zip), che a sua volta può contenere o
meno tutte o in parte le librerie di classi da cui dipendono le tue
classi.
Tra i tutorial della SUN tisegnalo proprio quello di uso di JAR,
questa pagina 
http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/deployment/jar/downman.html
contiene un esempio che fa al caso tuo. Nelle sezioni successive sono
spiegate tante altre cose di interesse.
Ciao
Daniele