Avatar billede luctatic Nybegynder
07. marts 2003 - 12:37 Der er 8 kommentarer og
1 løsning

RMI via SSL - Couldn't find trusted certificate

Prøver lige nu at lege med RMI via en SSL forbindelse. Fandt en række tutorials på SUNs egen hjemmeside, men kan ikke rigtigt afvikle dem. Smider lige eller 4 klasser der bliver brugt ind så I kan se dem.

package testsslpakke.jssesamples.rmi;
import java.io.*;
import java.net.*;
import java.rmi.server.*;
import javax.net.ssl.*;

public class RMISSLClientSocketFactory implements RMIClientSocketFactory, Serializable
{
    public Socket createSocket(String host, int port)
    throws IOException
    {
        SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
        SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
        return socket;
    }
}


package testsslpakke.jssesamples.rmi;

import java.io.*;
import java.net.*;
import java.rmi.server.*;
import javax.net.ssl.*;
import java.security.KeyStore;
import javax.net.*;
import javax.net.ssl.*;
import javax.security.cert.X509Certificate;

public class RMISSLServerSocketFactory
    implements RMIServerSocketFactory, Serializable {

    public ServerSocket createServerSocket(int port)
    throws IOException
    {
        SSLServerSocketFactory ssf = null;
        try {
        // set up key manager to do server authentication
        SSLContext ctx;
        KeyManagerFactory kmf;
        KeyStore ks;
        char[] passphrase = "fiskfisk".toCharArray();

        ctx = SSLContext.getInstance("SSL");
        kmf = KeyManagerFactory.getInstance("SunX509");
        ks = KeyStore.getInstance("JKS");

        ks.load(new FileInputStream("m:/keystore.jks"), passphrase);
        kmf.init(ks, passphrase);
        ctx.init(kmf.getKeyManagers(), null, null);

        ssf = ctx.getServerSocketFactory();
        } catch (Exception e) {
        e.printStackTrace();
        }
        return ssf.createServerSocket(port);
    }
}



Det var de to faktoryPatterns, nu kommer så implementationen af serveren:

package testsslpakke.jssesamples.rmi;

import java.net.InetAddress;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;

public class HelloImpl extends UnicastRemoteObject implements Hello
{
   
    public HelloImpl() throws RemoteException
    {
        super(0, new RMISSLClientSocketFactory(),
        new RMISSLServerSocketFactory());
    }
   
    public String sayHello()
    {
        return "Hello World!";
    }
   
    public static void main(String args[])
    {
       
        // Create and install a security manager
        if (System.getSecurityManager() == null)
            System.setSecurityManager(new RMISecurityManager());
        try
        {
            HelloImpl obj = new HelloImpl();
           
            // Bind this object instance to the name "HelloServer"
            Naming.rebind("//" +
            InetAddress.getLocalHost().getHostName()+"/HelloServer", obj);
           
            System.out.println("HelloServer bound in registry");
        } catch (Exception e)
        {
            System.out.println("HelloImpl err: " + e.getMessage());
            e.printStackTrace();
        }
   
    }
}


Og til sidst klienten:
package testsslpakke.jssesamples.rmi;

import java.net.InetAddress;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class HelloClient
{
   
    public static void main(String args[])
    {
        try
        {
            for(int i=0;i<args.length;i++)
                {System.out.println(i +" : "+args[i]);}
           
            String host = InetAddress.getLocalHost().getHostName();
            Hello obj = (Hello)Naming.lookup("//" +host+ "/HelloServer");
            //System.out.println("obj = "+obj);
            String message = obj.sayHello();
            System.out.println(message+"\n");
        } catch (Exception e)
        {
            System.out.println("HelloClient exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}



Nu starter vi så RMIregistry op, og starter serveren og den skriver fint "Helloserver bound in registry" så den del fungerer fint. Så starter vi klienten, og pludselig kommer den op med denne fejl:
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
        javax.net.ssl.SSLHandshakeException: Couldn't find trusted certificate

Efter meget roden frem og tilbage fandt jeg ud af, at det er fordi clienten ikke stoler på på certifikatet og det er sådan set ok. Vi har bare lagt certifikatet ind i keystore.jks, og da keytool spurgte om jeg ville markere det som _trusted_ svarede jeg ja, så det burde være trusted. Selve klienten startes op med disse parametre:

-Djavax.net.ssl.trustStore=m:/keystore.jks
-Djavax.net.ssl.keyStore=m:/keystore.jks
-Djavax.net.ssl.keyStorePassword=fiskfisk
-Djavax.net.ssl.trustStorePassword=fiskfisk

Så både trustStore og keyStore er sat til den samme, men det er der hvor nøglerne ligger, og hvor de ifølge keytool skulle være trusted. Lader til at mange over hele verden har problemer med det her, så hvorfor undrer det mig ikke at jeg også rendte ind i det.
Avatar billede magoo20000 Nybegynder
07. marts 2003 - 13:46 #1
Ved ikke, om det kan hjælpe, men har du set http://216.133.192.10/security/javasec/ssl_rmi.html
Avatar billede luctatic Nybegynder
07. marts 2003 - 13:56 #2
Den ville være helt vildt genial hvis det ikke var fordi det var den vi allerede brugte ;D
Avatar billede magoo20000 Nybegynder
07. marts 2003 - 14:09 #3
Det ved jeg, men det kunne være i kunne bruge noget i forbindelse med compilation-delen. Har i prøvet at debugge clienten (evt. med IntelliJ - den er glimrende til formålet).
Avatar billede luctatic Nybegynder
07. marts 2003 - 15:45 #4
Det med at bruge SSL over RMI er vist noget farligt noget. Når man kigger rundt omkring for forskellige fora's i verden ser man gerne de samme problemer igen og igen. Kan nok være at det ikke er helt godt udarbejdet eftersom det jo vist er en rimeligt ny teknologi der lige kom med i 1.4 tror jeg.

Lader vist desværre til at vi må droppe det. Det nægter kategorisk at virke uanset hvad vi prøver. Til gengæld får vi forskellige fejl alt efter vores angrebsvinkel. Festligt festligt.
Avatar billede arne_v Ekspert
07. marts 2003 - 21:23 #5
Lige for en god ordens skyld.

JSSE og JCE er nye i J2SE 1.4, men de har været tilgængelige
for separat download til J2SE 1.3 i længere tid (2 år ?).
Avatar billede luctatic Nybegynder
07. marts 2003 - 22:35 #6
ja - men at benytte SSL over RMI er stadig ikke noget der bliver brugt ret ofte, og klasserne til dem er åbentbart ikke helt gennemprøvede :(
Avatar billede arne_v Ekspert
07. marts 2003 - 22:40 #7
Mit gæt er at både RMI, SSL og JCE koden virker fint, men at
problemet ligger i SSL konfigurationen.

Det er et helvede at få det ¤&%¤""!"!!""%! sat rigtigt op.
Avatar billede luctatic Nybegynder
07. marts 2003 - 22:44 #8
hehe - helt korrekt. Er ikke ligefrem det nemmeste at krejle igennem med keystores, certifikater og alt det andet der skal hygges om.
Avatar billede luctatic Nybegynder
26. maj 2003 - 14:46 #9
Lukker skidtet. Tog et par timer at få på plads, og så et par timer at forstå og så et par timer at få rettet fejlene efter det kom på plads og man forstod hvad man måske havde ret i og så alligevel ikke fik rigtigt på plads i første omgang.

For at sige det kort - det gør jeg aldrig igen =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester