Newsgroup: it.comp.java
Titolo: ssl e sicurezza: storepass e keypass possono essere diverse?

Ho un dubbio sulla sicurezza della connessione SSL con SSLServerSocket e 
SSLSocket: se, creando i certificati, inserisco la stessa password per 
storepass e keypass, la connessione protetta funziona, mentre se sono 
diversi vanno in errore sia il client che il server. Ora, poichï¿œ per 
un'applicazione (o applet) che va scaricata da Internet la password va 
comunicata al client in chiaro (inserendola nel jar, o in un file 
pubblicamente scaricabile, o qualcosa del genere), mi domandavo: il 
fatto che la password usata per generare il keystore sia pubblica non 
puï¿œ inficiare la sicurezza della connessione?
Allego il codice usato per fare il test:
--------------------------------------------------------------------------------
# file 'prova' contenente i comandi usati per compilare i files java, 
creare i certificati e far partire le applicazioni client e server
# lavoro soto Linux, sotto Windows andrebbe fatta ovviamente qualche 
modifica
rm *.jks *.cer
echo compilo EchoServer.java, EchoClient.java
javac EchoServer.java
javac EchoClient.java
ALIAS=marco
STOREPASS=123456
KEYPASS=123456 # se provo ad inserire qui un valore diverso, per esempio 
abcdef, le applicazioni client e server vanno in errore e non riescono a 
stabilire la connessione SSL
KEYSTORE=keystore.jks
TRUSTSTORE=truststore.jks
FILE=test.cer
echo genero chiavi
keytool -genkey -alias $ALIAS -keystore $KEYSTORE -dname "CN=prova, 
OU=server, O=test, L=Roma, S=Italy, C=IT" -keyalg RSA -storepass 
$STOREPASS -keypass $KEYPASS
echo esporto certificato
keytool -export -keystore $KEYSTORE -alias $ALIAS -rfc -file $FILE 
-storepass $STOREPASS
#esportato certificato
echo importo certificato
keytool -import -alias $ALIAS -file $FILE -keystore $TRUSTSTORE 
-storepass $STOREPASS
echo eseguo EchoServer
gnome-terminal --execute java -Djavax.net.ssl.keyStore=$KEYSTORE 
-Djavax.net.ssl.keyStorePassword=$STOREPASS EchoServer &
sleep 2
echo eseguo EchoClient
java -Djavax.net.ssl.trustStore=$TRUSTSTORE 
-Djavax.net.ssl.trustStorePassword=$KEYPASS EchoClient
--------------------------------------------------------------------------------
//classe server: file EchoServer.java
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class EchoServer
  {
   public static void main(String[]args)
    {
     try
      {
       SSLServerSocketFactory 
sslserversocketfactory=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
       SSLServerSocket 
sslserversocket=(SSLServerSocket)sslserversocketfactory.createServerSocket(9999);
       SSLSocket sslsocket=(SSLSocket)sslserversocket.accept();
       System.out.println("Server partito sulla porta 9999");
       InputStream inputstream=sslsocket.getInputStream();
       InputStreamReader inputstreamreader=new 
InputStreamReader(inputstream);
       BufferedReader bufferedreader=new BufferedReader(inputstreamreader);
       String string=null;
       while ((string=bufferedreader.readLine())!=null)
        {
         System.out.println(string);
         System.out.flush();
        }
      }
     catch (Exception exception)
      {
       exception.printStackTrace();
       System.out.println("Premi un tasto per terminare");
       BufferedReader in = new BufferedReader(new 
InputStreamReader(System.in));
       try {in.readLine();}
       catch (java.io.IOException e) {}
      }
    }
  }
--------------------------------------------------------------------------------
//classe client: file EchoClient.java
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;
public class EchoClient
  {
   public static void main(String[] arstring)
    {
     try
      {
       SSLSocketFactory 
sslsocketfactory=(SSLSocketFactory)SSLSocketFactory.getDefault();
       SSLSocket 
sslsocket=(SSLSocket)sslsocketfactory.createSocket("localhost", 9999);
       System.out.print("Scrivi una frase: ");
       InputStream inputstream=System.in;
       InputStreamReader inputstreamreader=new 
InputStreamReader(inputstream);
       BufferedReader bufferedreader=new BufferedReader(inputstreamreader);
       OutputStream outputstream=sslsocket.getOutputStream();
       OutputStreamWriter outputstreamwriter=new 
OutputStreamWriter(outputstream);
       BufferedWriter bufferedwriter=new BufferedWriter(outputstreamwriter);
       String string=null;
       while ((string=bufferedreader.readLine())!=null)
        {
         bufferedwriter.write(string+'\n');
         bufferedwriter.flush();
        }
      }
     catch (Exception exception)
      {exception.printStackTrace();}
    }
  }

 stabilire la connessione SSL
Dimenticavo, l'errore generato dall'applicazione server se STOREPASS 
differisce da KEYPASS è
Error constructing implementation [OMISSIS] Cannot recover key [OMISSIS],
mentre quello generato dal client è
Error constructing implementation [OMISSIS] Keystore was tampered with, 
or password was incorrect [OMISSIS].