Newsgroup: it.comp.java
Titolo: SSL tra applicazione e applet firmata (certificate_unknown???)

Non riesco a realizzare una connessione protetta tra un'applicazione e 
un'applet firmata, e spero che qualcuno di voi sia in grado di aiutarmi. 
Ecco cosa ho fatto:
1) Compilazione e creazione di due file, server.jar e client.jar.
2) Creazione del keystore (pwd) e del certificato (certificato.cer) con le 
seguenti istruzioni:
C:\jdk1.3.1_14\bin\keytool -genkey -alias marco -keystore pwd -dname 
"CN=Marco, OU=Marco, O=Marco, L=Roma, S=Italy, C=IT" -keyalg RSA -storepass 
123456
C:\jdk1.3.1_14\bin\jarsigner -keystore pwd -storepass 123456 -signedjar 
firmata.jar client.jar marco
C:\jdk1.3.1_14\bin\keytool -export -keystore pwd -alias marco -file 
certificato.cer -storepass 123456
(premo ok quando chiede la password, confermando quella già indicata)
3) Verifica del risultato, dopo aver posto il file pwd nella cartella dove 
si trovano server.jar e client.jar, e certificato.cer in quella dove si 
trova firmata.jar:
a) tra applicazione e applicazione:
apro client.jar e server.jar con le istruzioni (in cmd):
java -jar -D -Djavax.net.ssl.keyStore=pwd -Djavax.net.ssl.keyStorePassword=123456 
server.jar
java -jar -Djavax.net.ssl.trustStore=pwd -Djavax.net.ssl.trustStorePassword=123456 
client.jar
Risultato: tutto funziona correttamente.
b) tra applicazione e applet:
apro il client con l'istruzione (in cmd):
java -jar -D -Djavax.net.ssl.keyStore=pwd -Djavax.net.ssl.keyStorePassword=123456 
server.jar
e, in Internet Explorer con java5 attivo, il file d:\...\java.htm che apre a 
sua volta l'applet firmata.jar; accetto il certificato per la sessione, e 
l'applet riesce correttamente a leggere e scrivere su disco. Quando, però, 
tento di iniziare la connessione con 127.0.0.1, ottengo le seguenti 
eccezioni:
sul client: javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
valid certification path to requested target
sul server: javax.net.ssl.SSLHandshakeException: Received fatal alert: 
certificate_unknown
Non so più che pesci pigliare; mi serve una soluzione semplice per l'utente 
(escluso, quindi, che ogni client debba smanettare con file di policy 
varie), ma non riesco a trovarla.
Help me.
Buon anno
Marco 

 un'applet firmata, e spero che qualcuno di voi sia in grado di aiutarmi.
Scopo: realizzare un'applet da inserire in un sito web, che realizzi una
connessione protetta perlomeno per l'invio di nome utente e password con il
sito di provenienza. Quindi, necessità di compatibilità massima.
Situazione: sono ancora in alto mare.Preciso i tentativi che ho fatto, nella
speranza che qualcuno possa aiutarmi.
Server e client sono costruiti seguendo le indicazioni di
http://tvilda.stilius.net/java/java_ssl.php
, e, quando compilo con 1.2 o
1.3, uso il pacchetto aggiuntivo jsse-1_0_3_03-gl.zip, opportunamente
modificato (ho cambiato con un monitor esadecimale i vari COM/... in
com/...per non generare errori di compilazione) e inserito nel mio jar.
Questi sono i tentativi che ho fatto:
1) Creazione del certificato pwd.jks creato con "keytool -genkey -alias 
marco -keystore pwd.cer -keyalg RSA -storepass 123456" in
certificato.cer e firma dell'applet con "keytool -export -keystore 
wd.cer  -alias marco -file
certificato.cer -storepass 123456".
Del tuto inutile ai fini dell'SSL, che sembra non trovi il path del 
certificato.
2) Aggiunta, nell'init dell'applet, delle seguenti righe:
    System.setProperty("javax.net.ssl.trustStore", "C:\\prcorso\\pwd.jks");
    System.setProperty("javax.net.ssl.keyStore", "C:\\prcorso\\pwd.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "123456");
    System.setProperty("javax.net.ssl.trustStorePassword", "123456");
È l'unico metodo che funziona; ma solo con Java di Sun. Quello di default di
Window 98 e 2000 (Microsoft Corp 1.1.4) genera l'eccezione 
java.lang.noSuchMethodError:
java/util/Properties: Method
setProperty(Ljava/lang/String;Ljava/lang/String)Ljava/lang/Object; not found
Buono per pochi selezionati utenti, ma in un'applet sul web non farebbe
neanche aprire la finestra a troppi potenziali utenti. Al momento, scartato.
2) Inserimento nel jar di pwd.cer, e modifica della classe client.java 
seguendo le indicazioni della pagina
http://forum.java.sun.com/thread.jspa?threadID=609800&messageID=3898842
 come 
segue:
  InputStream stream=getClass().getResourceAsStream("pwd.cer");
  java.security.KeyStore ks=java.security.KeyStore.getInstance("jks");
  ks.load(stream,"123456".toCharArray());
  javax.net.ssl.TrustManagerFactory 
tmf=javax.net.ssl.TrustManagerFactory.getInstance(javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm());
  tmf.init(ks);
  javax.net.ssl.SSLContext 
ctx=javax.net.ssl.SSLContext.getInstance("SSLv3");
  ctx.init(null,tmf.getTrustManagers(),null);
  SSLSocketFactory sslsocketfactory=ctx.getSocketFactory();
// il tutto, al posto di SSLSocketFactory 
sslsocketfactory=(SSLSocketFactory)SSLSocketFactory.getDefault();
Risultato: non funziona con applicazioni compilate con 1.4 e successivi, non 
funziona con Applet, dà errori di compilazione con 1.2 e 1.3 in quanto il 
pacchetto integrativo jsse-1_0_3_03-gl.zip non contiene alcune delle classi 
utilizzate (Figuratevi Microsoft 1.1.4!).
Scartato, ma se c'è un altro modo di inserire il certificato nel jar e farlo 
leggere, sarebbe la soluzione migliore... meglio, se funziona anche con 
Microsoft Corp 1.1.4.
3) Utilizzo del tag OBJECT al posto di APPLET nella pagina HTML, per 
costringere l'utente a scaricarsi il java di SUN (1.4 o 1.5) se non lo ha 
già, senza dover ricorrere a lunghe istruzioni, inadatte agli utenti più 
inesperti...
Risultato: Internet Exlorer in Windows 2000 visualizza solo l'alert "Le 
impostazioni di protezione correnti non consentono l'esecuzione degli 
activeX, senza neppure la barra con l'opzione "Permetti", come in XP.
INSOMMA, AIUTOOOOOOO!!!!!